LÆR ARDUINO
INTRODUKSJON TIL OPPGAVENE
Introduksjon til oppgavene
Her er et lite knippe oppgaver det er mulig å gjøre med en Arduino og litt ekstrautstyr. Hver oppgave har en liste med utstyret som du trenger og eventuelle bibloteker du kan bruke.
OPPGAVE 1
Dataoverføring
Dataoverføring
Vanskelighetsgrad
Lett
Utstyr
- 2 stk. Arduino Uno R3
- MX-FS-03V transmitter modul
- MX-05V, receiver modul
- 2 stk. Breadboard m/ledningssett
- WH1602 eller HD44780 16x2 Character LCD Display
- 10k potentiometer
- 3,7V batteri (eller hvis dere er 2 elever, bruker dere bare deres egne pc`er)
Bibliotek
- VirtualWire Library - Zip fil - VirtualWire Library
Sende data fra Arduino med transmitter MX-FS-03Vtil Arduino med receiver MX-05V
Sammendrag
I denne veiledningen vil vi se hvordan vi kan overføre tekst og annen data fra en Arduino Uno og sende den til en annen Arduino ved hjelp av RF (transmitter og receiver som benytter 433MHz) – og vise dataene ved hjelp av Seriell overvåker programmet som dere finner under topp menyen – Verktøy – Seriell overvåker.

Figuren ovenfor gir en oversikt over Arduino Uno kortet, hvor de 11 digitale og 6 analoge portene er markert i gul ramme. I tillegg er kommunikasjonsportene Tx og Rx innrammet.
Transmitter modulen, MX-FS-03V

Egenskaper til transmitter
- Product Model: MX-FS-03V
- Launch distance : 20-200 meters (different voltage, different results)
- Operating voltage :3.5-12V
- Dimensions: 19 * 19mm
- Operating mode: AM
- Transfer rate: 4KB/s
- Transmitting power: 10mW
- Transmitting frequency: 433M
- Pinout from left to right: (DATA; VCC; GND)
Koblingsskjema
Kode
Kode vi kan bruke, knyttet til transmittermodulen.
#includechar cad[100]; int i=0; void setup() { Serial.begin(9600); vw_setup(2000); Serial.print("End with \".\" each data"); } void loop() { if( Serial.available() > 0) { cad[i] = Serial.read(); i++; } if( cad[i-1] == '.') { cad[i] = '\0'; i=0; vw_send((byte *)cad, strlen(cad)); delay(400); } }
Receiver modulen, MX-05V
Receiver module parametre
- Product Model MX-05V
- Operating voltage: DC 5V
- Quiescent current: 4mA
- Receiving frequency: 433MHZ
- Receiver sensitivity:-105DB
- Size: 30 * 14 * 7mm
- Hvis en ekstra antenne er nødvendig, bruk en spiral 50Ω, en 1/4 bølgelengde antenne.
Koblingsskjema receiver
Kode
Kode vi kan bruke, knyttet til receivermodulen.
#include#include LiquidCrystal lcd(7, 6, 5, 4, 3, 2); char cad[100]; int pos = 0; void setup() { lcd.begin(16, 2); lcd.setCursor(1, 0); vw_setup(2000); vw_rx_start(); } void loop() { byte buf[VW_MAX_MESSAGE_LEN]; byte buflen = VW_MAX_MESSAGE_LEN; int i; if( vw_get_message(buf, &buflen) ) { if(pos < 2) lcd.setCursor(0, pos); else { pos=0; lcd.clear(); } for (i = 1; i < buflen; i++) { lcd.print((char)buf[i]); pos++; } } }
Løsningsforslag
OPPGAVE 2
Dataoverføring WiFi
Dataoverføring WiFi
Vanskelighetsgrad
Middels
Utstyr
- 1 stk. Arduino Uno R3
- ESP8266-12E WiFi modul
- 1 stk. Breadboard m/ledningssett
Bibliotek
- VirtualWire Library - Zip fil - VirtualWire Library
Overføre data fra Arduino Uno til ThingSpeak med ESP8266-12E WiFi modulen.
Sammendrag
I denne veiledningen vil vi se hvordan vi kan overføre sensordata fra en Arduino Uno og publisere dataene til ThingSpeak med hjelp av WiFi modulen ESP8266.

Figuren ovenfor gir en oversikt over Arduino Uno kortet, hvor de 11 digitale og 6 analoge portene er markert i gul ramme. I tillegg er kommunikasjonsportene Tx og Rx innrammet.
WiFI modul ESP8266-12E
Egenskaper til WiFi modul ESP8266-12E
- Product Model: MX-FS-03V
- Launch distance : 20-200 meters (different voltage, different results)
- Operating voltage :3.5-12V
- Dimensions: 19 * 19mm
- Operating mode: AM
- Transfer rate: 4KB/s
- Transmitting power: 10mW
- Transmitting frequency: 433M
- Pinout from left to right: (DATA; VCC; GND)
Pin kofigurasjon og funksjoner
Koblingsskjema transmitter?
Kode
Kode vi kan bruke, knyttet til transmittermodulen.
#includechar cad[100]; int i=0; void setup() { Serial.begin(9600); vw_setup(2000); Serial.print("End with \".\" each data"); } void loop() { if( Serial.available() > 0) { cad[i] = Serial.read(); i++; } if( cad[i-1] == '.') { cad[i] = '\0'; i=0; vw_send((byte *)cad, strlen(cad)); delay(400); } }
Kode vi kan bruke, knyttet til receiverrmodulen.
#include#include LiquidCrystal lcd(7, 6, 5, 4, 3, 2); char cad[100]; int pos = 0; void setup() { lcd.begin(16, 2); lcd.setCursor(1, 0); vw_setup(2000); vw_rx_start(); } void loop() { byte buf[VW_MAX_MESSAGE_LEN]; byte buflen = VW_MAX_MESSAGE_LEN; int i; if( vw_get_message(buf, &buflen) ) { if(pos < 2) lcd.setCursor(0, pos); else { pos=0; lcd.clear(); } for (i = 1; i < buflen; i++) { lcd.print((char)buf[i]); pos++; } } }
Løsningsforslag
OPPGAVE 3
Dataverføring GPS
Dataoverføring GPS
Vanskelighetsgrad
Middels
Utstyr
- 1 stk. Arduino Uno R3
- NEO-6M GPS modul
- 1 stk. Breadboard m/ledningssett
Bibliotek
- TinyGPS++ library: - Zip fil - TinyGPS++ library
Referanser
- Last minute engineers: - Interface ublox NEO-6M GPS Module with Arduino
Overføre GPS data fra Arduino Uno med NEO-6M GPS-modulen
Sammendrag
I denne veiledningen vil vi se hvordan vi kan overføre sensordata fra en NEO 6M GPS-modul som er koblet til en Arduino Uno.

Figuren ovenfor gir en oversikt over Arduino Uno kortet, hvor de 11 digitale og 6 analoge portene er markert i gul ramme. I tillegg er kommunikasjonsportene Tx og Rx innrammet.
Litt om GPS modulen, NEO-6M
Egenskaper til NEO-6M
- Receiver Type: 50 channels, GPS L1 (1575.42 MHz)
- Horizontal Position Accuracy: 2.5m
- Navigation Update Rate: 1HZ (5Hz maximum)
- Capture Time: Cool start: 27s Hot start: 1s
- Navigation Sensitivity: -161dBm
- Communication Protocol: NMEA, UBX Binary, RTCM
- Serial Baud Rate: 4800-230400 (default 9600)
- Operating Voltage: 2.7V ~ 3.6V
- Operating Current: 45mA
- TXD/RXD Impedance: 510Ω
Position Fix LED Indicator

Det er en LED på NEO-6M GPS-modulen som indikerer statusen for Posisjonsoppsetting. Den vil blinke i forskjellige mønstre avhengig av hvilken tilstand den er i:
- Ingen blinking: Leter etter satelitter
- Blinker hvert 1 sekund: Position Fix er funnet (modulen ser nok satelitter)
Driftsspenningen til NEO-6M-brikken er fra 2,7 til 3,6 V. Men den gode nyheten er at modulen leveres med MIC5205 ultra-low dropout 3V3 regulator fra MICREL.
Logikknålene er også 5 volts tolerante, slik at vi enkelt kan koble den til en Arduino eller en 5V logisk mikrokontroller uten å bruke noen logisk nivåomformer.
Batteri og EEPROM
Modulen er utstyrt med en HK24C32 to-leder seriell EEPROM. Den er 4KB i størrelse og koblet til NEO-6M-brikken via I2C.
Modulen inneholder også et oppladbart knappe batteri som fungerer som en super kondensator.
En EEPROM sammen med batteriet bidrar til å beholde batteribacket RAM (BBR). BBR inneholder klokkedata, siste stillingsdata (GNSS-bane-data) og modulkonfigurasjon. Men den er ikke ment for permanent datalagring.
Da batteriet beholder klokke og siste posisjon, reduseres tid til første reparasjon (TTFF) betydelig til 1s. Dette gir mye raskere posisjonslås.
Uten batteriet starter GPS alltid kaldstart, slik at den opprinnelige GPS-låsen tar mer tid.
Batteriet lades automatisk når strømmen påføres og holder data i opptil to uker uten strøm.
Antennen
Det kreves en antenne for å bruke modulen til enhver form for kommunikasjon. Så, modulen leveres med en patch-antenne med sensitivitet på 161 dBm.
Du kan feste denne antennen på en liten U.FL-kontakt som er plassert på modulen.
Patch antenne er flott for de fleste prosjekter. Men hvis du vil oppnå mer følsomhet eller sette modulen inn i et metallhus, kan du også klikke på en 3V aktiv GPS-antenne via U.FL-kontakten.
NEO-6M GPS Module Pinout
NEO-6M GPS-modulen har totalt 4 pinner som grensesnittet til omverdenen. Tilkoblingene er som følger
Koblingsskjema
Kode
Kode vi kan bruke er
#include// Choose two Arduino pins to use for software serial int RXPin = 2; int TXPin = 3; //Default baud of NEO-6M is 9600 int GPSBaud = 9600; // Create a software serial port called "gpsSerial" SoftwareSerial gpsSerial(RXPin, TXPin); void setup() { // Start the Arduino hardware serial port at 9600 baud Serial.begin(9600); // Start the software serial port at the GPS's default baud gpsSerial.begin(GPSBaud); } void loop() { // Displays information when new sentence is available. while (gpsSerial.available() > 0) Serial.write(gpsSerial.read()); }
Last opp programmet og åpne seriell skjermen fra Arduino IDE. Husk å velge 9600 baud. Du bør se tekst som følgende
Dataene du får over det serielle grensesnittet er faktisk NMEA setninger.
NMEA er et akronym for National Marine Electronics Association. Dette er et standardmeldingsformat for nesten alle GPS-mottakere.
NMEA-standarden er formatert i linjer med data som kalles setninger. Hver setning er kommaseparert for å gjøre det lettere å analysere med datamaskiner og mikrokontroller.
Disse NMEA setningene sendes ut på et intervall kalt oppdateringsfrekvensen.
NEO-6M GPS-modul oppdaterer denne informasjonen en gang per sekund (1Hz-frekvens) som standard. Men du kan konfigurere den for opptil 5 oppdateringer per sekund (5Hz frekvens).
TinyGPS++ library
Ofte for våre prosjekter, må vi analysere NMEA setninger i nyttig informasjon. For å forenkle arbeidet vårt har vi et bibliotek kalt TinyGPS ++ bibliotek.
Dette biblioteket krever mye tung løft for å motta data fra GPS-moduler, for eksempel å lese og trekke ut nyttige data i bakgrunnen. Så, vi trenger ikke å bekymre deg for icky parsing arbeid.
Link til zip-fil finner du i toppen av oppgaven
Når du har installert biblioteket, kan du kopiere skissen under til Arduino IDE.
Følgende test skisse vil skrive ut plasseringsinformasjonen (breddegrad, lengdegrad og høyde) og UTC (dato og klokkeslett) på den seriell skjerm.
#include#include // Choose two Arduino pins to use for software serial int RXPin = 2; int TXPin = 3; int GPSBaud = 9600; // Create a TinyGPS++ object TinyGPSPlus gps; // Create a software serial port called "gpsSerial" SoftwareSerial gpsSerial(RXPin, TXPin); void setup() { // Start the Arduino hardware serial port at 9600 baud Serial.begin(9600); // Start the software serial port at the GPS's default baud gpsSerial.begin(GPSBaud); } void loop() { // This sketch displays information every time a new sentence is correctly encoded. while (gpsSerial.available() > 0) if (gps.encode(gpsSerial.read())) displayInfo(); // If 5000 milliseconds pass and there are no characters coming in // over the software serial port, show a "No GPS detected" error if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println("No GPS detected"); while(true); } } void displayInfo() { if (gps.location.isValid()) { Serial.print("Latitude: "); Serial.println(gps.location.lat(), 6); Serial.print("Longitude: "); Serial.println(gps.location.lng(), 6); Serial.print("Altitude: "); Serial.println(gps.altitude.meters()); } else { Serial.println("Location: Not Available"); } Serial.print("Date: "); if (gps.date.isValid()) { Serial.print(gps.date.month()); Serial.print("/"); Serial.print(gps.date.day()); Serial.print("/"); Serial.println(gps.date.year()); } else { Serial.println("Not Available"); } Serial.print("Time: "); if (gps.time.isValid()) { if (gps.time.hour() < 10) Serial.print(F("0")); Serial.print(gps.time.hour()); Serial.print(":"); if (gps.time.minute() < 10) Serial.print(F("0")); Serial.print(gps.time.minute()); Serial.print(":"); if (gps.time.second() < 10) Serial.print(F("0")); Serial.print(gps.time.second()); Serial.print("."); if (gps.time.centisecond() < 10) Serial.print(F("0")); Serial.println(gps.time.centisecond()); } else { Serial.println("Not Available"); } Serial.println(); Serial.println(); delay(1000); }
Det er noen nyttige funksjoner du kan bruke med TinyGPS ++-objektet. Få av dem er oppført nedenfor
gps.speed.value ()
-funksjonen returnerer gjeldende bakkenhastighet i 100-tallet av en knute.gps.course.value ()
-funksjonen returnerer nåværende grunnkurs i 100-tallet av en grad.gps.satellites.value ()
-funksjonen returnerer antall synlige deltakende satellitter.gps.hdop.value ()
returnerer horisontal reduksjon av presisjon.- Hvis du vil vite hvor gammel en objekts data er, kan du ringe sin alder () -metode, som returnerer antall millisekunder siden den siste oppdateringen. Hvis dette returnerer en verdi som er større enn 1500 eller så, kan det være et tegn på et problem som en tapt løsning.
- Hvis du vil trekke ut data fra en hvilken som helst annen NMEA setning. Kan du bruke bibliotekets egenutviklingsfunksjonalitet ved å fortelle TinyGPS + + setningsnavnet og feltnummeret du er interessert i, slik:
TinyGPSCustom magneticVariation (gps,"GPRMC", 10)
Og du kan spørre det akkurat som de andre:magneticVariation.value()
Løsningsforslag
OPPGAVE 4
GPS data på Google maps
Vis GPS data på Google map
Vanskelighetsgrad
Middels
Utstyr
- 1 stk. ESP12E NodeMCU v.3.0
- NEO-6M GPS modul med antenne
- 1 stk. Breadboard m/lednings sett
Bibliotek
- TinyGPS++ library: - Zip fil - TinyGPS++ library
Referanser
- Hackster.io: - Show GPS data on Google map from ESP12E and NEO 6M GPS
- Last minute engineers: - Interface ublox NEO-6M GPS Module with Arduino
Vis GPS data på Google maps fra ESP12E og NEO-6M GPS
Sammendrag
I denne veiledningen skal vi ta elevforsøk 3 et steg videre og vil se på hvordan vi kan overføre sensordata fra en NEO 6M GPS-modul som er koblet til en ESP12E NodeMCU til Google maps.

ESP12E NodeMCU
Figuren ovenfor gir en oversikt over ESP12E NodeMCU kortet.
Egenskaper til ESP12E NodeMCU
- Receiver Type: 50 channels, GPS L1 (1575.42 MHz)
- Horizontal Position Accuracy: 2.5m
- Navigation Update Rate: 1HZ (5Hz maximum)
- Capture Time: Cool start: 27s Hot start: 1s
- Navigation Sensitivity: -161dBm
- Communication Protocol: NMEA, UBX Binary, RTCM
- Serial Baud Rate: 4800-230400 (default 9600)
- Operating Voltage: 2.7V ~ 3.6V
- Operating Current: 45mA
- TXD/RXD Impedance: 510Ω
NEO-6M GPS Module Pinout
NEO-6M GPS-modulen har totalt 4 pinner som grensesnittet til omverdenen. Tilkoblingene er som følger
Koblingsskjema
Kode
Kode vi kan bruke er
#include#include #include "ThingSpeak.h" #include /* This sample sketch demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object. It requires the use of SoftwareSerial, and assumes that you have a 4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx). */ static const int RXPin = 12, TXPin = 13; static const uint32_t GPSBaud = 9600; // repace your wifi username and password const char* ssid = "Your-ssid"; const char* password = "your-password"; unsigned long myChannelNumber = Replace it with your thingspeak channel number; const char * myWriteAPIKey = "Replace it with your Thingspeak write api key"; // The TinyGPS++ object TinyGPSPlus gps; WiFiClient client; // The serial connection to the GPS device SoftwareSerial ss(RXPin, TXPin); void setup() { Serial.begin(115200); ss.begin(GPSBaud); Serial.println(F("DeviceExample.ino")); Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module")); Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion()); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); Serial.print("Netmask: "); Serial.println(WiFi.subnetMask()); Serial.print("Gateway: "); Serial.println(WiFi.gatewayIP()); ThingSpeak.begin(client); } void loop() { // This sketch displays information every time a new sentence is correctly encoded. while (ss.available() > 0) if (gps.encode(ss.read())) displayInfo(); if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println(F("No GPS detected: check wiring.")); while(true); } } void displayInfo() { // Serial.print(F("Location: ")); if (gps.location.isValid()) { double latitude = (gps.location.lat()); double longitude = (gps.location.lng()); String latbuf; latbuf += (String(latitude, 6)); Serial.println(latbuf); String lonbuf; lonbuf += (String(longitude, 6)); Serial.println(lonbuf); ThingSpeak.setField(1, latbuf); ThingSpeak.setField(2, lonbuf); ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey); delay(20000); } else { Serial.print(F("INVALID")); } Serial.print(F(" Date/Time: ")); if (gps.date.isValid()) { Serial.print(gps.date.month()); Serial.print(F("/")); Serial.print(gps.date.day()); Serial.print(F("/")); Serial.print(gps.date.year()); } else { Serial.print(F("INVALID")); } Serial.print(F(" ")); if (gps.time.isValid()) { if (gps.time.hour() < 10) Serial.print(F("0")); Serial.print(gps.time.hour()); Serial.print(F(":")); if (gps.time.minute() < 10) Serial.print(F("0")); Serial.print(gps.time.minute()); Serial.print(F(":")); if (gps.time.second() < 10) Serial.print(F("0")); Serial.print(gps.time.second()); Serial.print(F(".")); if (gps.time.centisecond() < 10) Serial.print(F("0")); Serial.print(gps.time.centisecond()); } else { Serial.print(F("INVALID")); } Serial.println(); }
TinyGPS++ library
Ofte for våre prosjekter, må vi analysere NMEA setninger i nyttig informasjon. For å forenkle arbeidet vårt har vi et bibliotek kalt TinyGPS ++ bibliotek.
Dette biblioteket krever mye tung løft for å motta data fra GPS-moduler, for eksempel å lese og trekke ut nyttige data i bakgrunnen. Så, vi trenger ikke å bekymre deg for icky parsing arbeid.
Link til zip-fil finner du i toppen av oppgaven
Når du har installert biblioteket, kan du kopiere skissen under til Arduino IDE.
Følgende test skisse vil skrive ut plasseringsinformasjonen (breddegrad, lengdegrad og høyde) og UTC (dato og klokkeslett) på den seriell skjerm.
#include#include // Choose two Arduino pins to use for software serial int RXPin = 2; int TXPin = 3; int GPSBaud = 9600; // Create a TinyGPS++ object TinyGPSPlus gps; // Create a software serial port called "gpsSerial" SoftwareSerial gpsSerial(RXPin, TXPin); void setup() { // Start the Arduino hardware serial port at 9600 baud Serial.begin(9600); // Start the software serial port at the GPS's default baud gpsSerial.begin(GPSBaud); } void loop() { // This sketch displays information every time a new sentence is correctly encoded. while (gpsSerial.available() > 0) if (gps.encode(gpsSerial.read())) displayInfo(); // If 5000 milliseconds pass and there are no characters coming in // over the software serial port, show a "No GPS detected" error if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println("No GPS detected"); while(true); } } void displayInfo() { if (gps.location.isValid()) { Serial.print("Latitude: "); Serial.println(gps.location.lat(), 6); Serial.print("Longitude: "); Serial.println(gps.location.lng(), 6); Serial.print("Altitude: "); Serial.println(gps.altitude.meters()); } else { Serial.println("Location: Not Available"); } Serial.print("Date: "); if (gps.date.isValid()) { Serial.print(gps.date.month()); Serial.print("/"); Serial.print(gps.date.day()); Serial.print("/"); Serial.println(gps.date.year()); } else { Serial.println("Not Available"); } Serial.print("Time: "); if (gps.time.isValid()) { if (gps.time.hour() < 10) Serial.print(F("0")); Serial.print(gps.time.hour()); Serial.print(":"); if (gps.time.minute() < 10) Serial.print(F("0")); Serial.print(gps.time.minute()); Serial.print(":"); if (gps.time.second() < 10) Serial.print(F("0")); Serial.print(gps.time.second()); Serial.print("."); if (gps.time.centisecond() < 10) Serial.print(F("0")); Serial.println(gps.time.centisecond()); } else { Serial.println("Not Available"); } Serial.println(); Serial.println(); delay(1000); }
Det er noen nyttige funksjoner du kan bruke med TinyGPS ++-objektet. Få av dem er oppført nedenfor
gps.speed.value ()
-funksjonen returnerer gjeldende bakkenhastighet i 100-tallet av en knute.gps.course.value ()
-funksjonen returnerer nåværende grunnkurs i 100-tallet av en grad.gps.satellites.value ()
-funksjonen returnerer antall synlige deltakende satellitter.gps.hdop.value ()
returnerer horisontal reduksjon av presisjon.- Hvis du vil vite hvor gammel en objekts data er, kan du ringe sin alder () -metode, som returnerer antall millisekunder siden den siste oppdateringen. Hvis dette returnerer en verdi som er større enn 1500 eller så, kan det være et tegn på et problem som en tapt løsning.
- Hvis du vil trekke ut data fra en hvilken som helst annen NMEA setning. Kan du bruke bibliotekets egenutviklingsfunksjonalitet ved å fortelle TinyGPS + + setningsnavnet og feltnummeret du er interessert i, slik:
TinyGPSCustom magneticVariation (gps,"GPRMC", 10)
Og du kan spørre det akkurat som de andre:magneticVariation.value()
Løsningsforslag
OPPGAVE 5
Wifi-kontrollert bil
Wifi-kontrollert bil
Vanskelighetsgrad
Enkel
Utstyr
- ESP8266 ESP-01
- L298N Motordrivermodul
- Arduino UNO
- Bil Chassis
- 4 x 5V gearmotorer
- Kobberledninger
- Strømforsyning
Bibliotek
- Ingen bibliotek
Referanser
- electronicshub.org: - WiFi Controlled Robot using ESP8266 and Arduino
WiFi-kontrollert bil med ESP8266 og Arduino
Sammendrag
I dette prosjektet har vi bygget en enkel fjernstyrt bil (robotbil) som kan styres via WiFi Network, dvs. brukerinngangene for styring av robotens bevegelse er gitt via WiFi, ved hjelp av en enkel HTML-side.
Litt om ESP8266 ESP-01 kortet
ESP8266 ESP-01 er en Wifi-modul som gir mikrokontrollere tilgang til et Wifi-nettverk. Denne modulen er et selvstendig SOC (System On a Chip) som ikke nødvendigvis trenger en mikrokontroller for å manipulere innganger og utganger som du normalt ville gjøre med en Arduino, for eksempel fordi ESP-01 fungerer som en liten datamaskin. Avhengig av versjonen av ESP8266 er det mulig å ha opptil 9 GPIOer (General Purpose Input Output).
Dermed kan vi gi en mikrokontroller internettilgang som Wifi-skjoldet gjør for Arduino, eller vi kan ganske enkelt programmere ESP8266 for ikke bare å ha tilgang til et Wifi-nettverk, men også å fungere som en mikrokontroller.
Litt om L298N motor kontroller modulen
L298N motorregulatoren følger H-brokonfigurasjonen, som er nyttig når du styrer rotasjonsretningen til en likestrøms motor. En H-bros skjematisk ser slik ut
Her roterer motoren i retning diktert av bryterne. Når S1 og S4 er på, er den venstre motorterminalen mer positiv enn den høyre terminalen, og motoren roterer i en bestemt retning. På den annen side, når S2 og S3 er på, er den høyre motorterminalen mer positiv enn den venstre motorterminalen, slik at motoren roterer i den andre retningen.
Den andre fordelen med å bruke en H-bro er at du kan gi en separat strømforsyning til motoren. Dette er svært viktig, spesielt når du bruker et Arduino-bord hvor 5V-strømkilden ikke er nok for to DC-motorer.
L298N er en integrert krets som følger H-bro konseptet. Den kommer i to IC-pakker: MultiWatt15 og PowerSO20. Her er pin Outs for hver pakke
Denne IC`en driver to motorer gjennom to kanaler, A og B. For eksempel, hvis en motor bruker kanal A, må terminalene være koblet til pinnene Out 1 og Out 2. Den aktiverte pinnen må være high for å slå på motoren. For å kjøre en motor i en retning, si for eksempel med klokken, må pin Input 1 være high, mens pin Input 2 må være lav. For å kjøre motoren mot urviseren må pin Input 1 være lav mens pin Input 2 må være høy.
Kode
Følgende er Arduino-koden for prosjektet. I denne koden, skriv inn SSID og passord i WiFi-nettverket ditt på markerte steder.
#include/* Pins 8, 9, 10 and 11 of Arduino are connected to L298N Motor Driver Input pins i.e. IN1, IN2, In3 and IN4 respectively*/ #define IN1 8 #define IN2 9 #define IN3 10 #define IN4 11 #define DEBUG true #define RXPIN 2 #define TXPIN 3 SoftwareSerial esp8266Serial(RXPIN,TXPIN); //Pin 2 & 3 of Arduino as RX and TX. Connect TX and RX of ESP8266 respectively. void setup() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); Serial.begin(9600); esp8266Serial.begin(115200); //Baud rate for communicating with ESP8266. Your's might be different. esp8266Data("AT+RST\r\n", 5000, DEBUG); // Reset the ESP8266 esp8266Data("AT+CWMODE=1\r\n", 5000, DEBUG); //Set station mode Operation /*Change the following command as per your requirement i.e. enter the SSID and Password of your WiFi Network in the command.*/ esp8266Data("AT+CWJAP=\"SSID\",\"PASSWORD\"\r\n", 5000, DEBUG);//Enter your WiFi network's SSID and Password. /*while(!esp8266Serial.find("OK")) { }*/ esp8266Data("AT+CIFSR\r\n", 5000, DEBUG);//You will get the IP Address of the ESP8266 from this command. /* The following statement is to assign Static IP Address to ESP8266. The syntax is AT+CIPSTA= , , . This will assign a Static IP Address of 192.168.1.254 (in my case) to the ESP8266 Module. Change this value as per your requirements i.e. this IP address shouldn't conflict with any other device. Also, the second and third parameters are Gateway and Net Mask values. You can get these values from ipconfig command in command prompt*/ esp8266Data("AT+CIPSTA=\"192.168.1.254\",\"192.168.1.1\",\"255.255.255.0\"\r\n", 3000, DEBUG); // Assign Static IP Address esp8266Data("AT+CIFSR\r\n", 5000, DEBUG);//You will get the IP Address of the ESP8266 from this command. esp8266Data("AT+CIPMUX=1\r\n", 5000, DEBUG); esp8266Data("AT+CIPSERVER=1,80\r\n", 5000, DEBUG); } void loop() { if (esp8266Serial.available()) { if (esp8266Serial.find("+IPD,")) { String msg; esp8266Serial.find("?"); msg = esp8266Serial.readStringUntil(' '); String command1 = msg.substring(0, 5); String command2 = msg.substring(6); if (DEBUG) { Serial.println(command1);//Must print "robot" Serial.println(command2);//Must print "FWD" or "REV" or "LFT" or "RGT" or "STP" } delay(100); if (command2 == "FWD") { forward(); } if (command2 == "REV") { reverse(); } if (command2 == "RGT") { right(); } if (command2 == "LFT") { left(); } if (command2 == "STP") { stoprobot(); } } } } void forward() { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } void reverse() { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); } void left() { digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } void right() { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); } void stoprobot() { digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); } String esp8266Data(String command, const int timeout, boolean debug) { String response = ""; esp8266Serial.print(command); long int time = millis(); while ( (time + timeout) > millis()) { while (esp8266Serial.available()) { char c = esp8266Serial.read(); response += c; } } if (debug) { Serial.print(response); } return response; }
Det er også en del i koden som er ansvarlig for å tilordne en statisk IP-adresse til ESP8266-modulen. Denne IP-adressen (sammen med standard Gateway og Subnet Mask) må endres i henhold til det nettverket du skal bruke til øvelsen.
Det er svært viktig at den statiske IP-adressen du vil tildele, ikke kommer i konflikt med noen annen enhet i nettverket ditt, dvs. ingen annen enhet skal ha samme IP-adresse.
Så skann etter alle IP-adressene i nettverket og tilordne forsiktig IP-adressen.
HTML kode
Så skann etter alle IP-adressene i nettverket og tilordne forsiktig IP-adressen.
HTML bil fil - Last ned HTML fil
Last ned koden ovenfor med .html-utvidelsen og last også ned jquery.js-filen. Plasser begge disse filene i en enkelt mappe.
Circuit Design
Den første viktige tingen å huske på er at vi må programmere Arduino`en. og den er ansvarlig for konfigurering av ESP8266-modulen via seriell kommunikasjon og også styring av L298N-motordrivermodulen.
Så, Digital Pins 2 og 3 av Arduino er konfigurert som RX og TX ved hjelp av SoftwareSerial-funksjonen. Disse pinnene er koblet til TX- og RX-pinnene til ESP8266-modulen.
Deretter er inngangene til L298N-motordrivermodulen, dvs. IN1, IN2, IN3 og IN4, koblet til Digital Pins 8, 9, 10 og 11 av Arduino UNO.
Ser vi på bilrobotens chassis, så har den 4 gearmotorer. Så vi kobler de to høyre motorer parallelt og koblet dem til OUT1 og OUT2 terminaler på Motor Driver. På samme måte vender de to venstre motorer til OUT3 og OUT4.
Avslutningsvis
Last opp Arduino-koden etter å ha gjort nødvendige tilkoblinger og endringer i koden. Hvis du åpner seriell skjerm for Arduino IDE, kan du se AT-kommandoene som sendes til ESP8266-modulen.
Etter at ESP-modulen er koblet til WiFi, tildeler den den statiske IP-en og oppretter også serveren. Når serveren er opprettet, venter ESP-modulen på å koble til en klient.
Nå, hvis du åpner HTML-siden som du har lastet ned tidligere, kan du lage et enkelt oppsett som består av fem knapper med navn FORWARD, REVERSE, RIGHT, LEFT og STOP.
Løsningsforslag
OPPGAVE 6
Spenningsdetektor
Spenningsdetektor
Vanskelighetsgrad
Enkel
Utstyr
- 3 x Transistorer NPN – 2N3904
- Motstand – 1.0 MW (R1)
- Motstand – 100 KW (R2)
- Motstand – 220 W (R3)
- Led, rød 5mm
- Skyvebryter 2P, C&K
- Batterikontakt, 1x 9V
Bibliotek
- Ingen bibliotek
Bygg din egen spenningsdetektor
Sammendrag
I denne veiledningen skal vi bygge en enkel spenningsdetektor som detekterer spenning kontaktløst. Det vil si, uten å være i kontakt med kretsen som sjekkes.
Monter komponentene på et breadboard eller et PCB og lodd dem en etter en på de passende stedene i henhold til kretsskjemaet.
Koble en terminal på kobbertråden til basen til den første transistoren. Kobbertråden vil fungere som en antenne. Tips: For å øke følsomheten, bruk ca. 10 til 12 cm ledning.
Koble ledningene til bryteren ifølge kretsskjemaet.
Hvis ønskelig kan en utvide forsøket med lydgiver (buzzer) og bryter.
Kretsdiagram for spenningsdetektoren
Første bilde viser kretsdiagram for spenningsdetektoren. Det andre bildet viser en mulig utvidelse av detektoren med lydgiver (buzzer) og bryter.