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

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.

Arduino board

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

Transmitter

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

Koblingsskjema

Kode

Kode vi kan bruke, knyttet til transmittermodulen.

#include 
char 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

Transmitter

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

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

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.

Arduino board

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

Wifi board

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

pin configuration pin configuration

Koblingsskjema transmitter?

Kode

Kode vi kan bruke, knyttet til transmittermodulen.

#include 
char 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

Referanser

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.

Arduino board

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

Wifi board

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

Arduino mikrokontroller

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.

Antenne

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

Neo 6m pins

Koblingsskjema

Koblingsskjema GPS

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

9600 Baud

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

Referanser

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.

Arduino mikrokontroller

ESP12E NodeMCU

ESP12E NodeMCU kort

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

Neo 6m pins

Koblingsskjema

Koblingsskjema GPS

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

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.

Wifi bil

Litt om ESP8266 ESP-01 kortet

Koblingsskjema GPS

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).

Koblingsskjema GPS

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

Koblingsskjema GPS

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

Koblingsskjema GPS

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.

Koblingsskjema GPS

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

Koblingsskjema GPS

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.

Koblingsskjema GPS

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.

Koblingsskjema GPS

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.

Koblingsoversikt Spenningsdetektor

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.

Koblingsoversikt Spenningsdetektor
Koblingsoversikt Spenningsdetektor

Løsningsforslag

OM OSS