Svepande ultraljud avståndsmätare (4 / 4 steg)
Steg 4: Ladda upp koden
- Anslut Uno till en PC via USB. Kopiera koden nedan till en tom skiss med hjälp av Arduino IDE och ladda upp den till styrelsen.
- Du kommer att behöva importera ST7735 och Adafruit GFX bibliotek som finns här: http://learn.adafruit.com/1-8-tft-display/graphics-library
- Ta bort USB-kabeln och montera 2,1 mm plugg på Uno's power jack.
- Du har nu en fungerande svepande ultraljud avståndsmätare. Leka med några av variablerna som i koden för att ändra hastigheten på den servo och resultaten är ritade på displayen.
Denna kod bearbetar data från en Ultraljuds avståndsmätare monterad på en servo
Servo kommer sopa 180 grader
Data från ultraljud avståndsmätare ritas på displayen
För utbrytning, kan du använda någon (4 eller) 5 stift
#define sclk 4
#define mosi 5
#define cs 6
#define dc 7
#define rst 8 / / du kan också ansluta detta till Arduino Återställ
Använd dessa pins för sköld!
#define sclk 13
#define mosi 11
#define cs 10
#define dc 8
#define rst 0 / / du kan också ansluta detta till Arduino Återställ
#include < Adafruit_GFX.h > / / Core grafik bibliotek
#include < Adafruit_ST7735.h > / / maskinvaruspecifika bibliotek
#include < math.h >
#include < SPI.h >
#include < Servo.h >
#if defined(__SAM3X8E__)
#undef __FlashStringHelper::F(string_literal)
#define F(string_literal) string_literal
#endif
Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst);
flyta p = 3.1415926;
uint16_t x = 0;
uint16_t y = 0;
float vinkel = 0;
flyta angle2 = 0;
flyta angle1 = 0;
int framåt = 1;
int sensor = 0;
dubbla avståndet = 0;
uint16_t px = 0;
uint16_t py = 0;
dubbel skala =. 4;
int jag = 0;
dubbla hastigheten = 0,02;
float offset = 10;
int count = 0;
int pos = 0;
Servo servo;
int servopin = 9;
void setup(void) {
Bifoga servo och set till centrum position
servo.attach(servopin);
Delay(500);
servo.write(90);
Delay(500);
servo.detach(); Lossa innan du skickar display kommandon (SPI gränssnitt använder samma timers är Servo bibliotek)
tft.initR(INITR_BLACKTAB); initiera en ST7735S chip, svart flik
Om din TFT plast wrap har en röd flik, Använd följande:
tft.initR(INITR_REDTAB); initiera en ST7735R chip, röd flik
Om din TFT plast wrap har en grön flik, Använd följande:
tft.initR(INITR_GREENTAB); initiera en ST7735R chip, grön flik
Gör en svart skärm och sedan skriva bakgrund (text och bågar)
tft.fillScreen(ST7735_BLACK);
tft.setCursor (0, 152);
TFT.Print ("1m 2m 3m");
tft.setCursor (0, 0);
TFT.Print("SCANNING");
drawcircles();
angle1 = atan((float)tft.width()/((tft.height()/2.0)-offset));
angle2 = M_PI - angle1;
}
void loop() {
Beräkna positionen för servo (servo är 0-180degrees vinkel variabel är i radianer)
POS = 180.0-180.0*(angle/p);
avståndet = analogRead(sensor);
Atach servo i början av varje slinga
servo.attach(servopin);
Delay(15);
servo.write(POS);
Här koden konverterar polar cooridantes av sensorn till x-y-koordinater
Detta avgör vilka pixlar Rita sensordata
Koden varierar något beroende på kvadranten av vinkeln
IF(Angle<angle1) {
x = (uint16_t) (tft.height()/2-offset) * tan(angle);
y = (uint16_t) förskjutning;
PX = skala * avstånd * sin(angle);
py = tft.height () / 2 - skala * avstånd * cos(angle);
} else om (vinkel <(M_PI/2.0)) {
y = (uint16_t) ((tft.height()) / 2 - tft.width() / tan(angle));
x = tft.width();
PX = skala * avstånd * sin(angle);
py = tft.height () / 2 - skala * avstånd * cos(angle);
} annat if(angle<angle2) {
y = (uint16_t) ((tft.height()) / 2 + tft.width() / tan(M_PI-angle));
x = tft.width();
PX = skala * avstånd * sin(M_PI-angle);
py = tft.height () / 2 + skala * avstånd * cos(M_PI-angle);
} annat if(angle>angle2) {
x = (uint16_t) (tft.height()/2-offset) * tan(M_PI-angle);
y = (uint16_t) (tft.height()-offset);
PX = skala * avstånd * sin(M_PI-angle);
py = tft.height () / 2 + skala * avstånd * cos(M_PI-angle);
}
Koppla loss servo efter det har nått den position för cykeln och innan du skriver display kommandon
Delay(15);
servo.detach();
Rita en linje som representerar den riktning pekar mot sensorn
tft.drawLine (0, tft.height () / 2, x, y, ST7735_GREEN);
tft.drawLine (0, tft.height () / 2, x, y, ST7735_BLACK);
Rita en cirkel för sensorn
tft.fillCircle (px, py, 1, ST7735_RED);
Ritade objekt är arbetsintensivt, dras gröna bågarna endast varje 30 cykler
om (count > = 30) {
Count = 0;
drawcircles();
TFT.Print(".");
}
greve ++;
Här koden ändrar riktning servo roterar när den når slutet av varje sopa (0 eller 180 grader)
Koden innehåller åter dra text och bågar som displayen rensas i slutet av varje svep
IF(forward==0) {
vinkel = vinkel-hastighet;
om (vinkel < = 0) {
vinkel = 0;
framåt = 1;
tft.fillScreen(ST7735_BLACK);
tft.setCursor (0, 152);
TFT.Print ("1m 2m 3m");
tft.setCursor (0, 0);
TFT.Print("SCANNING");
Count = 0;
drawcircles();
}
} annat {
vinkel = vinkel + hastighet;
om (vinkel > = M_PI) {
vinkel = M_PI;
framåt = 0;
tft.fillScreen(ST7735_BLACK);
tft.setCursor (0, 152);
TFT.Print ("1m 2m 3m");
tft.setCursor (0, 0);
TFT.Print("SCANNING");
Count = 0;
drawcircles();
}
}
}
En funktion för att rita cirklar
void drawcircles() {
tft.drawCircle (0, tft.height () / 2, tft.height () / 4-20, ST7735_GREEN);
tft.drawCircle (0, tft.height () / 2, (tft.height) / 2-20, ST7735_GREEN);
tft.drawCircle (0, tft.height () / 2, tft.width ()-20, ST7735_GREEN);
}