Hvorfor & Hvordan lære Elever At programmere Arduinoer

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