hvorfor hvordan lære at programmere...

52
JDN / No.1 Hvorfor & Hvordan lære at programmere Arduinoer Jens Dalsgaard Nielsen

Upload: tranhanh

Post on 18-Jul-2019

214 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.1

Hvorfor&

Hvordan lære

at programmere

Arduinoer

Jens Dalsgaard Nielsen

Page 2: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.2

http://es.aau.dk/staff/jdn/edu/courses/14-2/ars

• mine slides• alle kodeeksempler

Et C/arduino kursus

http://es.aau.dk/staff/jdn/edu/courses/14-2/imperativ/

Page 3: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.3

Teknologi konkurrencen

• IPADs, mobilos, HTC'er• Medicentre

Page 4: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.4

• IPAD, Iphone, HTC,...  1000 Mhz  8000000 kByte• Arduino                  16 Mhz        8 kByte

• Faktor 100 i processeringshastighed• Faktor 1 million i hukommelsesstørrelse

• Hvor ligger imponator effekten ?

• Hvor er “aha” oplevelsen ?

• Næææh – en gang far og mor var børn da ...

Page 5: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.5

Lærer/elevrollen

• Alle er i elevrollen her idag

• Der er hjælp at få• Der er støtte fra de andre elever (gruppearbejdet)• De fleste her har gået mindst 15 år i skole ;-)

• Man er lidt svær at skubbe af pinden – håber jeg

Page 6: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.6

Læring af eleverne

• Helt anden situation

• Nu er I læreren !

• Det største problem er at få et “drive” i eleverne• Alle sammen :-)

Page 7: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.7

Vejen mod målet

• KISS

• Der skal være en succes historie i hver time ! osse her :-)

• Need to know approach • HW• SW• ...

Page 8: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.8

TV køkken

• “Ready to fill in” dokumenter/templates• Et rigtigt eksempel til at lære af• Dropbox,skole IT,...• ENKELT !

• Arduino• Allerede færdige eksempler

Page 9: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.9

Imperativ programmeringssprog

• C,C++,java,...

• Programmer “byder” programmet at udføre hvad der skal udføres

Page 10: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.10

Page 11: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.11

Milestone 1

• Installer Arduino SW

• Start Arduino SW

• Se at det virker

• Note:• Windows XP, Vista, 7• MAC OS • Linux•• Muligheder for driver cirkus på windows/MAC OS med gamle

boards. Se http://arduino.cc/en/Guide/Guide

Page 12: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.12

Hvad betyder “at det virker” ?

• Open for comments ...

Page 13: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.13

Milestone 2

• Få forbindelse til cansat/arduino via USB-seriel

Page 14: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.14

!

• Arduino program kan startes• Man kan identificere USB serial port der tilhører Arduino

• Hint: ryk stik ud se hvilken der forsvinder

• Blink virker• Virker bare der er strømforsyning på arduino

Page 15: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.15

Dett var dagens lektion

• Eller ?

Page 16: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.16

kodning

• Er som udgangspunkt faktisk ret svært :-(

• men Arduino platform gør det let(tere)

#define K_set_fatal_err_hook(ahook) \((krnl_err (*)(void (*)(krnl_err (*fatal_hook) \ (krnl_err e, int sinner)))) \ (*(*pK_call_vector) \ [aK_set_fatal_err_hook])) (ahook)

Page 17: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.17

Step 1

• STRUKTUR

Page 18: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.18

Step 1

• STRUKTUR

start

Page 19: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.19

• setup• loop• loop• loop• loop• loop• ...

• Så hurtig som muligt !

• Dvs tid er noget I skal styre hvis I feks vil måle 2 gange i sekundet

Page 20: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.20

To typer ting man kan

• Udføre “fremmed” kode • husk imperativ – vi kommanderer

• Lave egen kode

• Tilføje egne kommentarer i kode

Udføre...

Serial.begin(9600);delay(1000);  // vent i 1000 millisek

Data/info til funktion

Page 21: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.21

Første program

/* Blink Turns on an LED on for one second, then off for one second, repeatedly. This example code is in the public domain. */void setup() { // initialize the digital pin as an output. // Pin 13 has an LED connected on most Arduino boards: pinMode(13, OUTPUT); }

void loop() { digitalWrite(13, HIGH); // set the LED on delay(1000); // wait for a second digitalWrite(13, LOW); // set the LED off delay(1000); // wait for a second}

Page 22: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.22

Andet program - morsevoid setup() { pinMode(13, OUTPUT); }void prik(){ digitalWrite(13, HIGH); // set the LED on delay(100); // wait for 0,2 sec digitalWrite(13, LOW); // set the LED off Delay(1000); // vent 1 sek}void streg(){ digitalWrite(13, HIGH); // set the LED on delay(600); // wait for 0,2 sec digitalWrite(13, LOW); // set the LED off Delay(1000); // vent 1 sek}void loop() { prik(); prik(); prik(); streg(); streg(); streg(); prik(); prik(); prik();}

Page 23: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.23

Funktions kald

Kald: navn(parameter) ;

Serial.begin(9600);delay(1000);pinMode(13,OUTPUT);

Man kan næsten snakke koden ( på bydeform: imperativ prog...)

; er sætningens “punktum”

Page 24: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.24

Egen kode – lighedstegnet

 X = 3; // ikke en ligning !!!        // husk imperativ        // vi “byder” x at holde        //  værdien 3

x = 3;x = x + 3;  // er helt lovligt

Højresiden regnes udVenstresiden sættes lig resultat

Så x er lig 6 efter ovenstående kode

Page 25: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.25

Datatyper – desværre nødvendigt

int  : heltal  ­32768, ­32767,...,0,1,2,32767

typiske fejl: x = 32767;x = x+1; 

hvad er x ??

x er ­32768

16 bit heltal :­( 

Page 26: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.26

heltal regneriint i;int j;int k;

void loop(){ j = 10; i = 20;

 k = j/i; k = k * 1000;

k = (j/i)*1000;

k = (1000 * j)/k ; ...

Page 27: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.27

heltal regneri – dagens resultat

int i;int j;int k;

void loop(){ j = 10; i = 20;

 k = j/i;              // k er nu 0  heltalsdivision k = k * 1000;

k = (j/i)*1000;       // 0

k = (1000 * j)/k ;    // k er nu 500 !!! ...

Page 28: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.28

Heltal

• Addition, ,Subtraktion, division og multiplikation er FARLIG !

• hvad kan man så ...

• tænke sig lidt om !

• Reducer formler inden de kodes

Page 29: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.29

Fra jord til bord I

• naturen: fysisk værdi (temperatur,tryk, acceleration,..)

• sensor representation: • typisk analog spænding

• Analog til digital converter• 10 bit 0-5V• 0,1,2,3,...1023 (1024 værdier)• 0 svarer til [0 - 5/(1023)[• 1: [5/1023 – 2*5/1023[• ...• 0: 0V• 1: 5/1023 V• 2: 2*5/1023 V //hm men ok

Page 30: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.30

Fra jord til bord II

• Måletal (0..1023) skal nu omfattes tilbage til fysisk enhed (SI?!?)

• temp[C] = (måletal *5/1023) /0,010 [C]

• husk igen på trunkering

• heltal:• måletal*5/1023• Altid 0 sålænge

måletal < 1023/5 ...

• I telemetri: • send også rådata hjem

Page 31: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.31

De ulineære – ntc case

Page 32: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.32

De intelligente

• serial interface: Serial.read() ...• GPS• NMEA telegrammer

$GPRMC,213513.200,A,0441.4187,N,07401.6579,W,0.56,59.66,280411,,,A*4C

$GPGGA,213513.400,0441.4187,N,07401.6579,W,1,7,1.28,2636.9,M,3.2,M,,*4C

$GPRMC,213513.400,A,0441.4187,N,07401.6579,W,0.56,59.66,280411,,,A*4A

$GPGGA,213513.600,0441.4187,N,07401.6579,W,1,7,1.28,2636.9,M,3.2,M,,*4E

Page 33: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.33

Temperatur sensor

// sensor: 20 mV pr grad C 0..85 grader ca// 0V ~= 0C// 0,400V ~= 20C    ­ 0,020 *20 

int raatemp,temp;

...raatemp = analogRead(A0);  // vi maaltetemp  = raatemp * 5/1023 * 0.020 ; 

NB : anglikansk kodning:   i decimaltal “.”

Page 34: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.34

Temperatur sensor

int raatemp,temp;...raatemp = analogRead(A0);  // vi maaltetemp  = raatemp * 5/1023 * 0.020 ;  // FEJL FJEL FEJL FJELL FEJL

temp er heltal  højreside er kommatal !!!

hvorfor ?

Page 35: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.35

Temperatur sensor – nu med kommatal

int raatemp;

float temp;...raatemp = analogRead(A0);  // vi maalte

temp  = (raatemp * 5/1023) * 0.020 ; 

 // FEJL FJEL FEJL FJELL FEJL

temp er 0.0   hvorfor ??? !!!

hvorfor ?

Page 36: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.36

Temperatur sensor – nu med kommatal

int raatemp;

float temp;...raatemp = analogRead(A0);  // vi maalte

temp = raatempt;temp  = (temp * 5/1023) * 0.020 ; 

 NU VIRKER DET :­)

 hvorfor ???

Page 37: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.37

Analog input

Page 38: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.38

!

• De forrige 20 slides viser hvor nemt der går detalie i det ...

• behov for 20 små enkle programmer der illustrerer det vi har set indtil nu

• hvem skriver dem

• ...

Page 39: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.39

milestones

• installering af Arduino• morse• las analog sensor• skriv den hjem til PC• int, float, byte• herunder “0” problematikken

• Gruppeproblematik• 2 prs teams - hvad hvis der havde været 6 prs grupper her ?

Page 40: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.40

Hvad mangler de for at kunne kode ?

• Strenge• løkker• if then else ?•• to ce keys

Page 41: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.41

Boolsk algebra

if (a == b){  }else{}

if ( a < b )

a og b er heltal    IKKE floats

Page 42: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.42

void setup() { Serial.begin(9600); }

void loop(){int kar;  kar = Serial.read();if (kar != ­1 ){  Serial.print(“vi har laest... “);  Serial.print(kar);}}

Page 43: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.43

telemetri som begreb

Page 44: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.44

Arduino

PChow are you

ArduinoArduinoArduino

I'm fine

Ren chat protokol

USB

Page 45: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.45

PAUSE

Page 46: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.46

Arduino

PC1

ArduinoArduinoArduino

2

Ren chat protokol

send tal overreturner værdi plus 1

USB

Page 47: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.47

Page 48: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.48

Telemetri – kapacitets problem

• Kommunikationslink feks 1200 baud ~ 100 Bytes/sec max !• Protokol overhead i eks AX.25• effektivt måske 75 Bytes/sec

• “klokken er nu 13:45 UTC pos er 72N 72W vandet er koldt”

• 55 bytes som tager 55/75 sec = 0,74 sec

void loop(){  readNmeaFraGPS();  sendTelemetriHjem();  delay(1000);}

LOOPTID ?????   mindst 1,74 sek ...

Page 49: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.49

Hvad mangler de for at kunne kode ?

• Strenge• løkker• if then else ?•• to ce keys

Page 50: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.50

int i1;int i2;

void loop(){  i1 = 3;  i2 = 4;

  if (i2 < i1) // boolsk evaluering på heltal  {  }  else  {  }

Page 51: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.51

if () ...

while (){}

boolske operatorer: <, >  <=, >=, ==,  !=  && (and) ||(or)

sammensatte udtryk er lovlig

if ( ( (i1< i2 ) && (pp >=3) )  || (isIFryser == true) )  

Page 52: Hvorfor Hvordan lære at programmere Arduinoerkom.aau.dk/~jdn/edu/courses/14-2/2014-ars-sep/cansat-coding1.pdf• Udføre “fremmed” kode • husk imperativ – vi kommanderer •

JDN / No.52

differentiering – jeps !