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 Data/info til funktion Udføre... 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() { Andet pinMode(13, OUTPUT); } void prik() { digitalWrite(13, HIGH); // set the delay(100); // wait for digitalWrite(13, LOW); // set the Delay(1000); // vent 1 sek } void streg() { digitalWrite(13, HIGH); // set the delay(600); // wait for digitalWrite(13, LOW); // set the Delay(1000); // vent 1 sek } void loop() { prik(); prik(); prik(); streg(); streg(); streg(); prik(); prik(); prik(); } program - morse LED on 0,2 sec LED off LED on 0,2 sec LED off 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 er nu 0 heltalsdivision k = k * 1000; 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 Arduino PC USB how are you I'm fine Ren chat protokol JDN / No.50 PAUSE JDN / No.51 Arduino PC USB 1 2 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
© Copyright 2024