Stap 4: Upload code
- De Uno verbinden met een PC via USB. Kopieer de code hieronder in een lege schets met behulp van de Arduino IDE en deze uploaden naar de Raad van bestuur.
- U moet importeren van de ST7735 en Adafruit GFX bibliotheken die hier gevonden worden: http://learn.adafruit.com/1-8-tft-display/graphics-library
- Verwijderen van de USB-kabel en de stekker van de 2.1mm hechten aan de Uno de macht jack.
- U hebt nu een werkende vegen ultrasone afstandsmeter. Spelen met enkele van de variabelen in de code te wijzigen van de snelheid van de servo en de manier waarop die de resultaten worden weergegeven op het display.
Deze code verwerkt gegevens uit een ultrasone afstandsmeter gemonteerd op een servo
De servo zullen vegen 180 graden
Gegevens van de ultrasone afstandsmeter is uitgezet op het display
Voor de breakout, kunt u om het even welk (4 of) 5 pinnen
#define sclk 4
#define mosi 5
#define cs 6
#define dc 7
#define rst 8 / / u kunt dit ook aansluiten op de Arduino reset
Gebruik deze pinnen voor het schild!
#define sclk 13
#define mosi 11
#define cs 10
#define dc 8
#define rst 0 / / u kunt dit ook aansluiten op de Arduino reset
#include < Adafruit_GFX.h > / / Core grafische bibliotheek
#include < Adafruit_ST7735.h > / / hardwarespecifieke bibliotheek
#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);
zweven p = 3.1415926;
uint16_t x = 0;
uint16_t y = 0;
float-hoek = 0;
zweven angle2 = 0;
zweven angle1 = 0;
int vooruit = 1;
int sensor = 0;
dubbele afstand = 0;
uint16_t px = 0;
uint16_t py = 0;
dubbele schaal =. 4;
int i = 0;
dubbele snelheid = 0,02;
float offset = 10;
int count = 0;
int pos = 0;
Servo de servo;
int servopin = 9;
ongeldig setup(void) {}
Servo en ingesteld op midden koppelen
Servo.attach(servopin);
delay(500);
Servo.write(90);
delay(500);
Servo.Detach(); Loskoppelen voordat de weergeven opdrachten (SPI interface maakt gebruik van dezelfde timers zijn Servo bibliotheek)
tft.initR(INITR_BLACKTAB); initialiseren van een tab ST7735S-chip, zwart
Als uw TFT plastic wikkel heeft een rood-Tab, met de volgende programmacode:
tft.initR(INITR_REDTAB); een ST7735R chip, rode tabblad initialiseren
Als uw TFT plastic wikkel heeft een groene tabblad, gebruikt u de volgende opdracht:
tft.initR(INITR_GREENTAB); een ST7735R chip, groene tabblad initialiseren
Maken van een zwart scherm en vervolgens afdrukken van de achtergrond (de tekst en de bogen)
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 {}
Berekenen van positie voor servo (servo is 0-180degrees, terwijl de variabele hoek in radialen)
POS = 180.0-180.0*(angle/p);
afstand = analogRead(sensor);
De servo koppelen aan het begin van elke lus
Servo.attach(servopin);
delay(15);
Servo.write(POS);
Deze code converteert polar cooridantes van sensor naar de x-en y-coördinaten
Hiermee bepaalt u welke pixels te trekken van de sensorgegevens over
De code verschilt enigszins afhankelijk van het kwadrant van de hoek
if(Angle<angle1) {}
x = (uint16_t) (tft.height()/2-offset) * tan(angle);
y = offset (uint16_t);
PX = schaal * afstand * sin(angle);
py = tft.height () / 2 - schalen * afstand * cos(angle);
} else if (hoek <(M_PI/2.0)) {}
y = (uint16_t) ((tft.height()) / 2 - tft.width() / tan(angle));
x = tft.width();
PX = schaal * afstand * sin(angle);
py = tft.height () / 2 - schalen * afstand * cos(angle);
} else if(angle<angle2) {}
y = (uint16_t) ((tft.height()) / 2 + tft.width() / tan(M_PI-angle));
x = tft.width();
PX = schaal * afstand * sin(M_PI-angle);
py = tft.height () / 2 + schaal * afstand * cos(M_PI-angle);
} else if(angle>angle2) {}
x = (uint16_t) (tft.height()/2-offset) * tan(M_PI-angle);
y = (uint16_t) (tft.height()-offset);
PX = schaal * afstand * sin(M_PI-angle);
py = tft.height () / 2 + schaal * afstand * cos(M_PI-angle);
}
Loskoppelen van de servo nadat het zijn positie is geworden voor de cyclus en voor het schrijven van de weergeven opdrachten
delay(15);
Servo.Detach();
Teken een lijn die de richting die de sensor wijst vertegenwoordigt
tft.drawLine (0, tft.height () / 2, x, y, ST7735_GREEN);
tft.drawLine (0, tft.height () / 2, x, y, ST7735_BLACK);
Teken een cirkel voor de sensor
tft.fillCircle (px, py, 1, ST7735_RED);
Als tekenobjecten computationeel intensief is, worden de groene bogen alleen aangetrokken door elke 30 cycli
Als (graaf > = 30) {}
Graaf = 0;
drawcircles();
TFT.Print(".");
}
Graaf ++;
Deze code verandert de richting die de servo draait wanneer het einde van elke sweep (0 of 180 graden) is bereikt
De code bevat de tekst en de bogen opnieuw tekenen als de weergave is uitgeschakeld aan het einde van elke sweep
if(forward==0) {}
hoek = hoek-snelheid;
Als (hoek < = 0) {}
hoek = 0;
voorwaarts = 1;
tft.fillScreen(ST7735_BLACK);
tft.setCursor (0, 152);
TFT.Print ("1m 2m 3m");
tft.setCursor (0, 0);
TFT.Print("scanning");
Graaf = 0;
drawcircles();
}
} else {}
hoek = hoek + snelheid;
Als (hoek > = M_PI) {}
hoek = M_PI;
voorwaarts = 0;
tft.fillScreen(ST7735_BLACK);
tft.setCursor (0, 152);
TFT.Print ("1m 2m 3m");
tft.setCursor (0, 0);
TFT.Print("scanning");
Graaf = 0;
drawcircles();
}
}
}
Een functie voor het tekenen van cirkels
ongeldig 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);
}