Upload
tranhanh
View
218
Download
0
Embed Size (px)
Citation preview
JDN / No.1
Hvorfor&
Hvordan lære
at programmere
Arduinoer
Jens Dalsgaard Nielsen
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/
JDN / No.3
Teknologi konkurrencen
• IPADs, mobilos, HTC'er• Medicentre
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 ...
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
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 :-)
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• ...
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
JDN / No.9
Imperativ programmeringssprog
• C,C++,java,...
• Programmer “byder” programmet at udføre hvad der skal udføres
•
JDN / No.10
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
JDN / No.12
Hvad betyder “at det virker” ?
• Open for comments ...
JDN / No.13
Milestone 2
• Få forbindelse til cansat/arduino via USB-seriel
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
JDN / No.15
Dett var dagens lektion
• Eller ?
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)
JDN / No.17
Step 1
• STRUKTUR
JDN / No.18
Step 1
• STRUKTUR
start
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
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
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}
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();}
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”
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
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 :(
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 ; ...
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 !!! ...
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
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
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
JDN / No.31
De ulineære – ntc case
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
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 “.”
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 ?
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 ?
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 ???
JDN / No.37
Analog input
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
• ...
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 ?
JDN / No.40
Hvad mangler de for at kunne kode ?
• Strenge• løkker• if then else ?•• to ce keys
JDN / No.41
Boolsk algebra
if (a == b){ }else{}
if ( a < b )
a og b er heltal IKKE floats
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);}}
JDN / No.43
telemetri som begreb
JDN / No.44
Arduino
PChow are you
ArduinoArduinoArduino
I'm fine
Ren chat protokol
USB
JDN / No.45
PAUSE
JDN / No.46
Arduino
PC1
ArduinoArduinoArduino
2
Ren chat protokol
send tal overreturner værdi plus 1
USB
JDN / No.47
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 ...
JDN / No.49
Hvad mangler de for at kunne kode ?
• Strenge• løkker• if then else ?•• to ce keys
JDN / No.50
int i1;int i2;
void loop(){ i1 = 3; i2 = 4;
if (i2 < i1) // boolsk evaluering på heltal { } else { }
JDN / No.51
if () ...
while (){}
boolske operatorer: <, > <=, >=, ==, != && (and) ||(or)
sammensatte udtryk er lovlig
if ( ( (i1< i2 ) && (pp >=3) ) || (isIFryser == true) )
JDN / No.52
differentiering – jeps !