Hvorfor & Hvordan lære Elever At programmere Arduinoer Jens Dalsgaard Nielsen JDN / No.1
Teknologi konkurrencen IPADs, mobilos, HTC'er Medicentre JDN / No.2
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.3
Lærer/elevrollen Alle er i elevrollen her på Andøya 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.4
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.5
Vejen mod målet KISS Der skal være en succes historie i hver time! Need to know approach HW SW... JDN / No.6
Xtremene Learning Eliminer muligheden for at gemme sig! Eller giv alle mulighed for succes Ingen skal kunne gemme sig Hold størrelse 2-3 Hvert hold sin Arduino Hvert hold en PC :-) Dreng-pige diskussion Rene drenge og piger grupper Extremene Programming er en operational udviklings metode JDN / No.7
Mål og delmål og indsats CANSAT konkurrence Lokalt Alle er deltagere :-) National Et antal gymnasier er deltagere International Et antal lande er deltagere PR Intra/lokalt/region/landsdækkende/... Hvad er jeres mål for succes? Hvad sælger i som succes kriterier til eleverne? JDN / No.8
Hvorfor forrige slide? Fordi succes kriterier tildels afspejles i hvad der skal læres. Fordi det giver hvor meget tid der skal bruges på det i skolen. Korrekt afvejet får de fleste forhåbentlig en succes med hjem JDN / No.9
Hvad er programmering? Programmeringssprog Udviklingsomgivelser Testomgivelser Afviklingsomgivelser Interface med omverden Digitale signaler Analoge signaler Kommunikation ( GPS (NMEA 0183) I2C,TWI,SPI,... JDN / No.10
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.11
JDN / No.12
Før vi starter Grupper og HW 2 prs pr gruppe rene dreng og pige grupper som udgangspunkt 1 Arduino/cansat pr gruppe 1 Arduino kan fås til 200 NOK/DKK + USB kabel Find super users i klassen Dem der kan hjælpe de andre med de første step Prøv det selv fra bunden af på ren maskine Logbogen... JDN / No.13
Imperativ programmeringssprog C,C++,java,... Programmer byder programmet at udføre hvad der skal udføres JDN / No.14
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.15
Hvad betyder at det virker? Open for comments... JDN / No.16
Milestone 2 Få forbindelse til cansat/arduino via USB-seriel JDN / No.17
! 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.18
Dett var dagens lektion Eller? JDN / No.19
kodning Er som udgangspunkt faktisk ret svært C: http://www.control.aau.dk/~jdn/kernels/krnl/include/krnl2.h #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.20
Step 1 STRUKTUR JDN / No.21
Step 1 STRUKTUR start JDN / No.22
setup loop loop loop loop loop... Så hurtig som muligt! Dvs tid er noget I skal lave hvis I feks vil måle 2 gange i sekundet JDN / No.23
To typer ting man kan Udføre fremmed kode husk imperativ vi kommanderer Lave egen kode Tilføje egne kommentarer i kode Udføre... Data/info til funktion Serial.begin(9600); delay(1000); // vent i 1000 millisek JDN / No.24
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); delay(1000); digitalwrite(13, LOW); delay(1000); } // set the LED on // wait for a second // set the LED off // wait for a second JDN / No.25
Invented @??? JDN / No.26
Invented @ NTNU!!! JDN / No.27
void 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(); } Andet program - morse JDN / No.28
Funktions kald Kald: navn(parameter) ; ; er sætningens punktum Serial.begin(9600); delay(1000); pinmode(13,output); Man kan næsten snakke koden ( på bydeform: imperativ prog...) JDN / No.29
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 ud Venstresiden sættes lig resultat Så x er lig 6 efter ovenstående kode JDN / No.30
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 JDN / No.31
heltal regneri int 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.32
heltal regneri dagens resultat int i; int j; int k; void loop() { j = 10; i = 20; k = j/i; k = k * 1000; // k er nu 0 heltalsdivision k = (j/i)*1000; // 0 k = (1000 * j)/k ; // k er nu 500!!!... JDN / No.33
Heltal Addition,,Subtraktion, division og multiplikation er FARLIG! hvad kan man så... tænke sig lidt om! Reducer formler inden de kodes JDN / No.34
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.35
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.36
De ulineære ntc case JDN / No.37
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.38
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 maalte temp = raatemp * 5/1023 * 0.020 ; NB : anglikansk kodning: i decimaltal. JDN / No.39
Temperatur sensor int raatemp,temp;... raatemp = analogread(a0); // vi maalte temp = raatemp * 5/1023 * 0.020 ; // FEJL FJEL FEJL FJELL FEJL temp er heltal højreside er kommatal!!! hvorfor? JDN / No.40
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.41
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.42
Analog input JDN / No.43
! 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.44
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.45
Hvad mangler de for at kunne kode? Strenge løkker if then else? to ce keys JDN / No.46
Boolsk algebra if (a == b) { } else { } if ( a < b ) a og b er heltal IKKE floats JDN / No.47
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.48
telemetri som begreb JDN / No.49
PC USB how are you I'm fine Arduino Ren chat protokol JDN / No.50
PAUSE JDN / No.51
PC USB 1 2 Arduino Ren chat protokol send tal over returner værdi plus 1 JDN / No.52
JDN / No.53
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.54
Hvad mangler de for at kunne kode? Strenge løkker if then else? to ce keys JDN / No.55
int i1; int i2; void loop() { i1 = 3; i2 = 4; if (i2 < i1) // boolsk evaluering på heltal { } else { } JDN / No.56
if ()... while () { } boolske operatorer: <, > <=, >=, ==,!= && (and) (or) sammensatte udtryk er lovlig if ( ( (i1< i2 ) && (pp >=3) ) (isifryser == true) ) JDN / No.57
differentiering jeps! JDN / No.58