LÆR ARDUINO
INTRODUKSJON TIL LØSNINGSFORSLAG
Introduksjon
Løsningsforslagene er et av mange muligheter til å løse oppgavene på. Forsøk å løse oppgaven på egenhånd, før løsningsforslag benyttes. Ikke alle oppgavene har løsningsforslag tilgjengelig.
LØSNINGSFORSLAG OPPGAVE 1
Dataoverføring
Løsningsforslag dataoverføring
Et eksempel på oppsett med mottakeren og senderen
Sende kode:
/* FILE: MXFS03V_433MHZ_MODULE_HCMODU0007_TRANSMIT_EXAMPLE.pde DATE:
Dette er et eksempel på hvordan du bruker 433MHz trådløs sendermodulen (HCMODU0007)
som er Tx-delen av tranmitter- og mottakermodulparet. Dette eksemplet gjør bruk av
VirtualWire-biblioteket skrevet av Mike McCauley. Skissen vil lese en verdi fra analog inngang
A0 og overføre den som 2 byte til mottakermodulen en gang i sekundet.
Tx MODULE CONNECTIONS:
PIN DESCRIPTION
1. 1 GND
2. 2 VCC (3.512V)
3. 3 TX DATA
ARDUINO PIN GND
VCC
D2
*/
#include // Inkluder VirtualWire-biblioteket
const int TX_DIO_Pin = 2; // Digital IO-pin som vil bli brukt til å sende data til senderen
void setup() {
pinMode(13, OUTPUT);
// Initialiserer DIO-porten som brukes til å sende data til Tx-modulen
vw_set_tx_pin(TX_DIO_Pin);
// Sett senket logikknivå (LOW = overfør for denne versjon av modulen)
vw_set_ptt_inverted(true);
// Send på 2000 bits per sekund
vw_setup(2000); // Bits per sec }
/* Hoved programmet */
void loop()
{
// Midlertidig lagres verdien fra analog inngang A0
unsigned int Data;
// Overføringsbufferen som vil holde dataene som skal overføres.
byte TxBuffer[2];
// Les analog inngang A0...
Data = analogRead(A0);
// ... og lagre den som høy og lav byte i overføringsbufferen
TxBuffer[0] = Data >> 8; TxBuffer[1] = Data;
// Slå på lysdioden på pin 13 for å indikere at vi skal sende data
digitalWrite(13, HIGH);
// Send dataene (2 byte)
vw_send((byte *)TxBuffer, 2);
// Vent til dataene er sendt
vw_wait_tx();
// Slå av lysdioden på pin 13 for å indikere at vi nå har sendt dataene
digitalWrite(13, LOW);
// Gjør ingenting for et sekund. Senk denne verdien for å sende data raskere
delay(1000);
}
Mottaker kode:
/* FILE: MX05V_433MHZ_MODULE_HCMODU0007_RECEIVE_EXAMPLE.pde DATE: 03/03/13
Rx MODULE CONNECTIONS:
PIN DESCRIPTION
1. 1 GND
2. 2 RX DATA
3. 3 RX DATA
4. 4 VCC (5V)
ARDUINO PIN GND
D2
N/A
VCC
*/
// Inkluder VirtualWire-biblioteket
#include
// Digital IO-port som vil bli brukt til mottak av data fra mottakeren
const int RX_DIO_Pin = 2;
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600);
// Initialiserer DIO-porten som brukes til å motta data fra Rx-modulen
vw_set_rx_pin(RX_DIO_Pin);
// Motta med 2000 bits per sekund
vw_setup(2000);
// Aktiver mottakeren
vw_rx_start(); }
/* Hovedprogram */
void loop()
{
// Still mottakerbufferstørrelsen til 2 byte
uint8_t Buffer_Size = 2;
// Holder de gjenopptatte dataene
unsigned int Data;
// Mottaksbufferen
uint8_t RxBuffer[Buffer_Size];
/* Har en melding blitt mottatt? */
if (vw_get_message(RxBuffer, &Buffer_Size)) // Nonblocking
{
/* I så fall slår du på LED-lampen som er koblet til DIO 13 for å indikere dette */
digitalWrite(13, HIGH);
/* Lagre mottatte høye og lave byte data */
Data = RxBuffer[0] << 8 | RxBuffer[1];
/* Send disse dataene til UART */
Serial.print("Analogue pin A0: ");
Serial.println(Data);
/* Slå av lysdioden på port 13 for å indikere at dataene nå er mottatt */
digitalWrite(13, LOW);
}
}
Et enda enklere eksempel på oppsett med mottakeren og senderen
SSketch - Tilkobling av sendermodul til Arduino:
/*
En enkel send sketch
Denne skissen overfører en kort tekstmelding ved hjelp av VirtualWire-biblioteket
Koble transmitterdatapinnen til Arduino pin 12
*/
#include
void setup()
{
// Initialiser IO og ISR
vw_setup(2000); // Bits pr/sek
}
void loop()
{
send("Hallo! Jeg er elev i 12DLA");
delay(1000);
}
void send (char *message)
{
vw_send((uint8_t *)message, strlen(message));
vw_wait_tx(); // Vent til hele meldingen er borte
}
Sketch - Koble mottakermodul til Arduino:
/*
En enkel mottaks sketch
Denne skissen viser tekststrenger mottatt ved hjelp av VirtualWire Koble mottaker data pin til
Arduino pin 11
*/
#include
byte message[VW_MAX_MESSAGE_LEN]; // en buffer for å lagre innkommende
meldinger
byte messageLength = VW_MAX_MESSAGE_LEN; // størrelsen på meldingen
void setup()
{
Serial.begin(9600);
Serial.println("Mottakeren er klar");
// Initialize the IO and ISR
vw_setup(2000); // Bits pr/sek
vw_rx_start(); // Start mottakeren
}
void loop()
{
if (vw_get_message(message, &messageLength)) // Non-blocking
{
Serial.print("Received: ");
for (int i = 0; i < messageLength; i++)
{
Serial.write(message[i]);
}
Serial.println();
}
}
LØSNINGSFORSLAG OPPGAVE 2
Dataoverføring WiFi
Løsningsforslag dataoverføring WiFi
Et eksempel på oppsett med mottakeren og senderen
Sende kode: /* FILE: MXFS03V_433MHZ_MODULE_HCMODU0007_TRANSMIT_EXAMPLE.pde DATE: Dette er et eksempel på hvordan du bruker 433MHz trådløs sendermodulen (HCMODU0007) som er Tx-delen av tranmitter- og mottakermodulparet. Dette eksemplet gjør bruk av VirtualWire-biblioteket skrevet av Mike McCauley. Skissen vil lese en verdi fra analog inngang A0 og overføre den som 2 byte til mottakermodulen en gang i sekundet. Tx MODULE CONNECTIONS: PIN DESCRIPTION 1. 1 GND 2. 2 VCC (3.512V) 3. 3 TX DATA ARDUINO PIN GND VCC D2 */ #include// Inkluder VirtualWire-biblioteket const int TX_DIO_Pin = 2; // Digital IO-pin som vil bli brukt til å sende data til senderen void setup() { pinMode(13, OUTPUT); // Initialiserer DIO-porten som brukes til å sende data til Tx-modulen vw_set_tx_pin(TX_DIO_Pin); // Sett senket logikknivå (LOW = overfør for denne versjon av modulen) vw_set_ptt_inverted(true); // Send på 2000 bits per sekund vw_setup(2000); // Bits per sec } /* Hovedprogrammet */ void loop() { // Midlertidig lagres verdien fra analog inngang A0 unsigned int Data; // Overføringsbufferen som vil holde dataene som skal overføres. byte TxBuffer[2]; // Les analog inngang A0... Data = analogRead(A0); // ... og lagre den som høy og lav byte i overføringsbufferen TxBuffer[0] = Data >> 8; TxBuffer[1] = Data; // Slå på lysdioden på pin 13 for å indikere at vi skal sende data digitalWrite(13, HIGH); // Send dataene (2 byte) vw_send((byte *)TxBuffer, 2); // Vent til dataene er sendt vw_wait_tx(); // Slå av lysdioden på pin 13 for å indikere at vi nå har sendt dataene digitalWrite(13, LOW); // Gjør ingenting for et sekund. Senk denne verdien for å sende data raskere delay(1000); } Mottaker kode: /* FILE: MX05V_433MHZ_MODULE_HCMODU0007_RECEIVE_EXAMPLE.pde DATE: 03/03/13 Rx MODULE CONNECTIONS: PIN DESCRIPTION 1. 1 GND 2. 2 RX DATA 3. 3 RX DATA 4. 4 VCC (5V) ARDUINO PIN GND D2 N/A VCC */ // Inkluder VirtualWire-biblioteket #include // Digital IO-port som vil bli brukt til mottak av data fra mottakeren const int RX_DIO_Pin = 2; void setup() { pinMode(13, OUTPUT); Serial.begin(9600); // Initialiserer DIO-porten som brukes til å motta data fra Rx-modulen vw_set_rx_pin(RX_DIO_Pin); // Motta med 2000 bits per sekund vw_setup(2000); // Aktiver mottakeren vw_rx_start(); } /* Hovedprogram */ void loop() { // Still mottakerbufferstørrelsen til 2 byte uint8_t Buffer_Size = 2; // Holder de gjenopptatte dataene unsigned int Data; // Mottaksbufferen uint8_t RxBuffer[Buffer_Size]; /* Har en melding blitt mottatt? */ if (vw_get_message(RxBuffer, &Buffer_Size)) // Nonblocking { /* I så fall slår du på LED-lampen som er koblet til DIO 13 for å indikere dette */ digitalWrite(13, HIGH); /* Lagre mottatte høye og lave byte data */ Data = RxBuffer[0] << 8 | RxBuffer[1]; /* Send disse dataene til UART */ Serial.print("Analogue pin A0: "); Serial.println(Data); /* Slå av lysdioden på port 13 for å indikere at dataene nå er mottatt */ digitalWrite(13, LOW); } }
Et enda enklere eksempel på oppsett med mottakeren og senderen
Sketch - Tilkobling av sendermodul til Arduino: /* En enkel send sketch Denne skissen overfører en kort tekstmelding ved hjelp av VirtualWire-biblioteket Koble transmitterdatapinnen til Arduino pin 12 */ #includevoid setup() { // Initialiser IO og ISR vw_setup(2000); // Bits pr/sek } void loop() { send("Hallo! Jeg er elev i 12DLA"); delay(1000); } void send (char *message) { vw_send((uint8_t *)message, strlen(message)); vw_wait_tx(); // Vent til hele meldingen er borte } Sketch - Koble mottakermodul til Arduino: /* En enkel mottaks sketch Denne skissen viser tekststrenger mottatt ved hjelp av VirtualWire Koble mottaker data pin til Arduino pin 11 */ #include byte message[VW_MAX_MESSAGE_LEN]; // en buffer for å lagre innkommende meldinger byte messageLength = VW_MAX_MESSAGE_LEN; // størrelsen på meldingen void setup() { Serial.begin(9600); Serial.println("Mottakeren er klar"); // Initialize the IO and ISR vw_setup(2000); // Bits pr/sek vw_rx_start(); // Start mottakeren } void loop() { if (vw_get_message(message, &messageLength)) // Non-blocking { Serial.print("Received: "); for (int i = 0; i < messageLength; i++) { Serial.write(message[i]); } Serial.println(); } }
OPPGAVE 3
Dataoverføring GPS
Løsningsforslag dataoverføring GPS
Forklaring til koden skissert i oppgaveteksten
Skissen begynner med å inkludere TinyGPS ++ bibliotek og programvare seriellbibliotek. Deretter definerer vi arduino pins som NEO-6M GPS-modul er koblet til og variabel som lagrer standard GPS baud rate.
Opprettelse av TinyGPSPlus-objektet vil hjelpe til med å få tilgang til spesielle funksjoner knyttet til biblioteket. Deretter oppretter vi en seriell port med programvare som heter gpsSerial, som vi kan snakke med modulen.
#include#include int RXPin = 2; int TXPin = 3; int GPSBaud = 9600; TinyGPSPlus gps; SoftwareSerial gpsSerial(RXPin, TXPin); I oppsettfunksjonen må vi initiere seriell kommunikasjon med PC`en samt GPS-modulen. void setup() { Serial.begin(9600); gpsSerial.begin(GPSBaud); } I loop-funksjonen kaller vi displayInfo () tilpasset funksjon som skriver plasseringsinformasjon (Latitude, Longitude & Altitude) og UTC (Date & Time) på seriell skjerm, hver gang en ny NMEA setning er riktig kodet. Hvis 5000 millisekunder passerer og det ikke kommer noen tegn inn over programvarens serielle port, viser vi ingen GPS-oppdaget feil. void loop() { while (gpsSerial.available() > 0) if (gps.encode(gpsSerial.read())) displayInfo(); if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println(F("No GPS detected")); while(true); } }
Slik ser oppsettet ut på den seriell skjerm.
OPPGAVE 4
Vis GPS data på Google maps
Løsningsforslag vis GPS data på Google maps
Forklaring til koden skissert i oppgaveteksten
Skissen begynner med å inkludere TinyGPS ++ bibliotek og programvare seriellbibliotek. Deretter definerer vi arduino pins som NEO-6M GPS-modul er koblet til og variabel som lagrer standard GPS baud rate.
Opprettelse av TinyGPSPlus-objektet vil hjelpe til med å få tilgang til spesielle funksjoner knyttet til biblioteket. Deretter oppretter vi en seriell port med programvare som heter gpsSerial, som vi kan snakke med modulen.
#include#include int RXPin = 2; int TXPin = 3; int GPSBaud = 9600; TinyGPSPlus gps; SoftwareSerial gpsSerial(RXPin, TXPin); I oppsettfunksjonen må vi initiere seriell kommunikasjon med PC`en samt GPS-modulen. void setup() { Serial.begin(9600); gpsSerial.begin(GPSBaud); } I loop-funksjonen kaller vi displayInfo () tilpasset funksjon som skriver plasseringsinformasjon (Latitude, Longitude & Altitude) og UTC (Date & Time) på seriell skjerm, hver gang en ny NMEA setning er riktig kodet. Hvis 5000 millisekunder passerer og det ikke kommer noen tegn inn over programvarens serielle port, viser vi ingen GPS-oppdaget feil. void loop() { while (gpsSerial.available() > 0) if (gps.encode(gpsSerial.read())) displayInfo(); if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println(F("No GPS detected")); while(true); } }
Slik ser oppsettet ut på den seriell skjerm.