Stap 28: Program de Arduinos
Upload deze code naar de Arduino beheersing van het schild van de aanraking:
#include < Wire.h > #include < Adafruit_GFX.h > camera tuig Touch Screen Controller / / Core grafische bibliotheek #include < Adafruit_TFTLCD.h > / / hardwarespecifieke bibliotheek #include < TouchScreen.h > #if defined(__SAM3X8E__) #undef __FlashStringHelper::F(string_literal) #define F(string_literal) string_literal #endif #ifndef USE_ADAFRUIT_SHIELD_PINOUT #error "deze schets is bedoeld voor gebruik met het TFT LCD schild. Zorg ervoor dat USE_ADAFRUIT_SHIELD_PINOUT #defined in de Adafruit_TFTLCD.h bibliotheek bestand."#endif / / dit zijn de pinnen voor het schild! #define YP A1 / / moet worden van een analoge pin, "An" notatie gebruiken! #define XM A2 / / moet worden van een analoge pin, "An" notatie gebruiken! #define YM 7 / / kan een digital pin #define XP 6 / / kan de __SAM3X8E__ van een digital pin #ifdef #define TS_MINX 125 #define TS_MINY 170 #define TS_MAXX 880 #define TS_MAXY 940 #else #define TS_MINX 150 #define TS_MINY 120 #define TS_MAXX 920 #define TS_MAXY 940 #endif / / voor betere precisie van de druk, we willen weten van de weerstand / / tussen X + en X - gebruik een multimeter om het te lezen / / voor degene die we gebruiken , haar 300 ohm over de X plaat TouchScreen ts = TouchScreen (XP, YP, XM, YM, 300); #define LCD_CS A3 #define LCD_CD A2 #define LCD_WR A1 #define LCD_RD A0 / / leesbare namen toewijzen aan bepaalde gemeenschappelijke waarden van de 16-bits kleuren: #define BLACK 0x0000 #define 0x001F BLUE #define rood 0xF800 #define GREEN 0x07E0 #define 0x07FF cyaan #define MAGENTA 0xF81F #define 0xFFE0 gele #define WHITE 0xFFFF #define LBLUE 0x65FF Adafruit_TFTLCD tft; int oldcolor, currentcolor; BOOL pan = 1; int panPosition1 = 20; int panPosition2 = 20; BOOL tilt = 0; int tiltPosition1 = 20; int tiltPosition2 = 20; BOOL station = 0; int drivePosition1 = 20; int drivePosition2 = 20; BOOL tijd = 0; int timePosition1 = 20; int timePosition2 = 20; int startSend = 0; int x; void setup(void) {Wire.begin(); / / i2c bus (adres facultatief voor master) join Serial.begin(9600); tft.reset(); uint16_t-id = tft.readID(); if(identifier == 0x9325) {Serial.println (F ("gevonden ILI9325 LCD-rijder"));} anders if(identifier == 0x9328) {Serial.println (F ("gevonden ILI9328 LCD-rijder"));} anders if(identifier == 0x7575) {Serial.println (F ("gevonden HX8347G LCD-rijder"));} anders {Serial.print (F ("onbekende LCD driver chip:")); Serial.println (id, HEX); terugkeer; } tft.begin(identifier); tft.setRotation(1); tft.fillScreen(BLACK); drawMenu(); tft.drawRect (0, 0, 58, 40, wit); set eerste schuifregelaar Staten tft.drawRect (19 89, 272, 6, WHITE); tft.fillRect (20 90, 270, 4, geel); tft.drawRect (panPosition1, 71, 17, 42, wit); tft.fillRect ((panPosition1 + 1), 72, 15, 40, MAGENTA); tft.drawRect (19, 169, 272, 6, WHITE); tft.fillRect (20, 170, 270, 4, geel); tft.drawRect (panPosition2, 151, 17, 42, wit); tft.fillRect ((panPosition2 + 1), 152, 15, 40, MAGENTA); currentcolor = rood; pinMode (13, OUTPUT); } #define MINPRESSURE 10 #define MAXPRESSURE 1000 void loop {digitalWrite (13, hoge); Punt p = ts.getPoint(); digitalWrite (13, laag); Als deelt pennen, zult u moeten herstellen van de richtingen van de touchscreen pennen pinMode (XM, uitvoer); pinMode (YP, uitvoer); We hebben enkele minimale druk wij overwegen 'geldig' / / druk van 0 betekent geen dringende! Als (p.z > MINPRESSURE & & p.z < MAXPRESSURE) {/ / schaal van 0 -> 1023 te tft.width p.x = kaart (p.x, TS_MINX, TS_MAXX, tft.width(), 0); p.y = kaart (p.y, TS_MINY, TS_MAXY, tft.height(), 0); / / *** / / TOP MENUSELECTIE CODE! / / *** als (p.x > 300) {oldcolor = currentcolor; als (p.y < 58) {currentcolor = rood; tft.drawRect (0, 0, 58, 40, wit); pan = 1; kantelen = 0; station = 0; tijd = 0; drawSliders();} anders als (p.y < 140) {currentcolor = LBLUE; tft.drawRect (58 0, 82, 40, WITTE); pan = 0; Tilt = 1; Station = 0; tijd = 0; drawSliders(); } anders als (p.y < 180) {currentcolor = blauw; tft.drawRect (140, 0, 96, 40, wit); pan = 0; kantelen = 0; station = 1; tijd = 0; drawSliders();} anders als (p.y < 240) {currentcolor = groen; tft.drawRect (236, 0, 82, 40, wit); pan = 0; kantelen = 0; station = 0; tijd = 1; drawSliders();}} //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! MOET IK DIT HELEMAAL??? KAN HET MENU TEKENEN NET GELEZEN??? Als (oldcolor! = currentcolor) {als (oldcolor == RED) drawMenu(); als (oldcolor == LBLUE) drawMenu(), als (oldcolor == groen) drawMenu(); als (oldcolor == blauw) drawMenu();} / / *** / / START selectie CODE!!! Als (p.x < 40) {als (p.y > 180) {tft.drawRect (220 200, 96, 40, wit); startSend = 1;}} / / *** //SLIDER CODE! //Top SLIDER als (p.x > 180 & & p.x < 260) {als (p.y < 350) {als (p.y > = 20) {/ / of so... voor eerste zwarte vierkante... //need onderkant remap en top remap!!! p.y = kaart (p.y, 0, 0, 240 en 300); tft.fillRect (10, 71, (p.y - 10), 50, zwart); } tft.drawRect ((p.y-1) 71, 17, 42, witte); tft.fillRect (p.y, 72, 15, 40, MAGENTA); tft.fillRect ((p.y + 16), 71, (282 - p.y), 50, zwart); tft.drawRect ((p.y + 15), 89, (272 - p.y), 6, WHITE); tft.fillRect ((p.y + 16), 90, (270 - p.y), 4, geel); tft.drawRect (19, 89, (p.y - 19), 6, WHITE); tft.fillRect (20, 90, (p.y - 20), 4, geel); Als (pan == 1) {panPosition1 = p.y; / / Serial.println(panPosition1);} anders if(tilt == 1) {tiltPosition1 = p.y;} else if(drive == 1) {drivePosition1 = p.y;} anders if(time == 1) {timePosition1 = p.y;}} } //BOTTOM SLIDER als (p.x > 80 & & p.x < 160) {als (p.y < 350) {als (p.y > = 20) {/ / of so... voor eerste zwarte vierkante... //need onderkant remap en top remap! p.y = kaart (p.y, 0, 0, 240 en 300); tft.fillRect (10, 151, (p.y - 10), 50, BLACK);} tft.drawRect ((p.y-1) 151, 17, 42, witte); tft.fillRect (p.y, 152, 15, 40, MAGENTA); tft.fillRect ((p.y + 16) 151, (282 - p.y), 50, zwart); tft.drawRect ((p.y + 15), 169, (272 - p.y), 6, WHITE); tft.fillRect ((p.y + 16), 170, (270 - p.y), 4, geel); tft.drawRect (19, 169, (p.y - 19), 6, WHITE); tft.fillRect (20, 170, (p.y - 20), 4, geel); Als (pan == 1) {panPosition2 = p.y; Serial.println(panPosition2); anders} if(tilt == 1) {tiltPosition2 = p.y;} else if(drive == 1) {drivePosition2 = p.y;} anders if(time == 1) {timePosition2 = p.y;}} } / / *** //TRANSMITS aan andere ARDUINO / / *** if(startSend == 1) {transmitValues(); startSend = 0; delay(2000); drawMenu(); als (pan == 1) tft.drawRect (0, 0, 58, 40, wit); als (kantelen == 1) tft.drawRect (58, 0, 82, 40, wit); als (station == 1) tft.drawRect (140, 0, 96, 40, wit); als (tijd == 1) tft.drawRect (236, 0, 82, 40, wit);}} } ongeldig transmitValues() {Wire.beginTransmission(2); / / verzenden naar apparaat #2 x = panPosition1; Wire.write("a"); stuurt vijf bytes Wire.write(x); Wire.endTransmission(); stoppen met het verzenden van delay(100); Wire.beginTransmission(2); verzenden naar apparaat #2 x = panPosition2; Wire.write("b"); stuurt vijf bytes Wire.write(x); Wire.endTransmission(); stoppen met het verzenden van delay(100); Wire.beginTransmission(2); verzenden naar apparaat #2 x = tiltPosition1; Wire.write("c"); Wire.write(x); Wire.endTransmission(); stoppen met het verzenden van delay(100); Wire.beginTransmission(2); verzenden naar apparaat #2 x = tiltPosition2; Wire.write("d"); Wire.write(x); Wire.endTransmission(); stoppen met het verzenden van delay(100); Wire.beginTransmission(2); verzenden naar apparaat #2 x = drivePosition1; Wire.write("e"); stuurt vijf bytes Wire.write(x); Wire.endTransmission(); stoppen met het verzenden van delay(100); Wire.beginTransmission(2); verzenden naar apparaat #2 x = drivePosition2; Wire.write("f"); stuurt vijf bytes Wire.write(x); Wire.endTransmission(); stoppen met het verzenden van delay(100); Wire.beginTransmission(2); verzenden naar apparaat #2 x = timePosition1; Wire.write("g"); Wire.write(x); Wire.endTransmission(); stoppen met het verzenden van delay(100); Wire.beginTransmission(2); verzenden naar apparaat #2 x = timePosition2; Wire.write("h"); Wire.write(x); Wire.endTransmission(); stoppen met het verzenden van delay(100); Wire.beginTransmission(2); verzenden naar apparaat #2 x = startSend; Wire.write("i"); Wire.write(x); Wire.endTransmission(); ongeldig drawSliders() stop verzenden} {als (oldcolor ! = currentcolor) {tft.fillRect (10, 60, 200, 300 zwart);} if(pan == 1) {tft.drawRect (19 89, 272, 6, WHITE); tft.fillRect (20 90, 270, 4, geel); tft.drawRect (panPosition1, 71, 17, 42, wit); tft.fillRect ((panPosition1 + 1) 72, 15, 40, MAGENTA); tft.drawRect (19, 169, 272, 6, WHITE); tft.fillRect (20, 170, 270, 4, geel); tft.drawRect (panPosition2, 151, 17, 42, wit); tft.fillRect ((panPosition2 + 1) 152, 15, 40, MAGENTA);} anders if(tilt == 1) {tft.drawRect (19 89, 272, 6, WITTE); tft.fillRect (20 90, 270, 4, geel); tft.drawRect (tiltPosition1, 71, 17, 42, wit); tft.fillRect ((tiltPosition1 + 1), 72, 15, 40, MAGENTA); tft.drawRect (19, 169, 272, 6, WHITE); tft.fillRect (20, 170, 270, 4, geel); tft.drawRect (tiltPosition2, 151, 17, 42, wit); tft.fillRect ((tiltPosition2 + 1), 152, 15, 40, MAGENTA); } anders if(drive == 1) {tft.drawRect (19 89, 272, 6, WHITE); tft.fillRect (20 90, 270, 4, geel); tft.drawRect (drivePosition1, 71, 17, 42, wit); tft.fillRect ((drivePosition1 + 1) 72, 15, 40, MAGENTA); tft.drawRect (19, 169, 272, 6, WHITE); tft.fillRect (20, 170, 270, 4, geel); tft.drawRect (drivePosition2, 151, 17, 42, wit); tft.fillRect ((drivePosition2 + 1) 152, 15, 40, MAGENTA);} anders if(time == 1) {tft.drawRect (19, 89 272, 6, WHITE); tft.fillRect (20 90, 270, 4, geel); tft.drawRect (timePosition1, 71, 17, 42, wit); tft.fillRect ((timePosition1 + 1), 72, 15, 40, MAGENTA); tft.drawRect (19, 169, 272, 6, WHITE); tft.fillRect (20, 170, 270, 4, geel); tft.drawRect (timePosition2, 151, 17, 42, wit); tft.fillRect ((timePosition2 + 1), 152, 15, 40, MAGENTA); }} ongeldig drawMenu() {tft.fillRect (236, 0, 82, 40, GREEN); tft.fillRect (140, 0, 96, 40, blauw); tft.fillRect (58, 0, 82, 40, LBLUE); tft.fillRect (0, 0, 58, 40, RED); tft.drawChar (2, 10, 'P', wit, rood, 3); tft.drawChar (20, 10, 'A', wit, rood, 3); tft.drawChar (38, 10, 'N', wit, rood, 3); tft.drawChar (64, 10, 'T', wit, LBLUE, 3); tft.drawChar (82, 10, 'I', WHITE, LBLUE, 3); tft.drawChar (100 10, 'L', WHITE, LBLUE, 3); tft.drawChar (118, 10, 'T', wit, LBLUE, 3); tft.drawChar (144, 10, zou ', wit, blauw, 3); tft.drawChar (162, 10, 'R', wit, blauw, 3); tft.drawChar (180, 10, 'I', wit, blauw, 3); tft.drawChar (198, 10, 'V', wit, blauw, 3); tft.drawChar (216, 10, 'E', wit, blauw, 3); tft.drawChar (242, 10, 'T', wit, groen, 3); tft.drawChar (260, 10, 'I', wit, groen, 3); tft.drawChar (278, 10, ben ", wit, groen, 3); tft.drawChar (296, 10, 'E', wit, groen, 3); tft.fillRect (220 200, 96, 40, blauw); tft.drawChar (224, 210, de ' witte, blauwe, 3); tft.drawChar (242, 210, 'T', wit, blauw, 3); tft.drawChar (260, 210, 'A', wit, blauw, 3); tft.drawChar (278, 210, 'R', wit, blauw, 3); tft.drawChar (296, 210, 'T', wit, blauw, 3); } < br >
Upload deze code naar de Arduino die de motor controleren zullen:
Camera tuig motorcontroller #include < Servo.h > #define ENC_A 14 #define ENC_B 15 #define ENC_PORT PINC Servo panServo; Servo tiltServo; int afstand = 0; BOOL stateChange = 0; int motorPin = 3; LED aangesloten op digital pin 9 float driveX = 0; zweven tiltX = 0; zweven panX = 0; zweven timeX = 0; zweven driveZ = 0; zweven tiltZ = 0; zweven panZ = 0; zweven picZ = 0; int distanceToGo = 0; voor programma int progStart = 0; voor testen //int progStart = 1; int motorSpeed; float totalTilt; float totalPan; float totalDrive; float panIncrement; float tiltIncrement; float driveIncrement; zweven picsPerPanIncrement = 1; zweven picsPerTiltIncrement = 1; zweven picsPerDriveIncrement = 1; int panSteps = 0; int tiltSteps = 0; int driveSteps = 0; char dataRx [20]; #include < Wire.h > void setup {Wire.begin(2); / / join i2c bus met adres #2 Wire.onReceive(receiveEvent); / / registreren gebeurtenis Serial.begin(9600); / / start serieel voor uitvoer panServo.attach(4); tiltServo.attach(5); tiltServo.writeMicroseconds(1100); panServo.writeMicroseconds(1500); delay(10000); pinMode (8, OUTPUT); pinMode (ENC_A, INPUT); digitalWrite (ENC_A, hoge); pinMode (ENC_B, INPUT); digitalWrite (ENC_B, hoge);} void loop {if(progStart == 1) {tiltX = kaart (tiltX 0, 255, 750, 1450); tiltZ = kaart (tiltZ, 0, 255, 750, 1450); panX = kaart (panX, 0, 255, 600, 2200); panZ = kaart (panZ, 0, 255, 600, 2200); Serial.println(panX); Serial.println(panZ); if(timeX < 5) {motorSpeed = 150; driveX = (driveX, 0, 0, 255 180); timeX = 0;} else {motorSpeed = 75; driveX = (driveX, 0, 0, 255 360);} totalPan = (panX - panZ); totalPan = abs(totalPan); totalTilt = tiltX - tiltZ; totalTilt = abs(totalTilt); totalDrive = driveX; Serial.println(totalPan); //Figure uit hoe ver gaan voordat het nemen van foto's / / afwisselend, hoeveel foto's te nemen voor het bevorderen van / / *** / /!!!!!!!!!!!!!!!!!!!! DEZE MOETEN NEUKEN DRIJVERS EN SHIT! //! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! panIncrement = totalPan / picZ; if(totalPan < picZ) {picsPerPanIncrement = 1 / panIncrement; panIncrement = 1;} tiltIncrement = totalTilt / picZ; if(totalTilt < picZ) {picsPerTiltIncrement = 1 / tiltIncrement; tiltIncrement = 1;} driveIncrement = totalDrive / picZ; if(totalDrive < picZ) {picsPerDriveIncrement = 1 / driveIncrement; driveIncrement = 1;} / / *** //move servo's in de oorspronkelijke posities / / *** tiltServo.writeMicroseconds(tiltX); panServo.writeMicroseconds(panX); delay(10000); //Take enkele foto's en sommige spullen verplaatsen / / *** voor (int takingPictures = 0; takingPictures < picZ; takingPictures ++) {als (panSteps > = picsPerPanIncrement) {if(panX > panZ) {panServo.writeMicroseconds (panX - panIncrement); panX = panX - panIncrement;} anders if(panX < panZ) {panServo.writeMicroseconds (panX + panIncrement); panX = panX + panIncrement;} else {panServo.writeMicroseconds(panX)}; panSteps = 0; } Als (tiltSteps > = picsPerTiltIncrement) {if(tiltX > tiltZ) {tiltServo.writeMicroseconds (tiltX - tiltIncrement); tiltX = tiltX - tiltIncrement;} anders if(tiltX < tiltZ) {tiltServo.writeMicroseconds (tiltX + tiltIncrement); tiltX = tiltX + tiltIncrement;} else {tiltServo.writeMicroseconds(tiltX)}; tiltSteps = 0; } Als (driveSteps > = picsPerDriveIncrement) {analogWrite (motorPin, motorSpeed) while(distance < distanceToGo) {callEncoder()}; analogWrite (motorPin, 0); driveSteps = 0;} distanceToGo = distanceToGo + driveIncrement; delay(timeX * 500); Serial.println ("SHOOT!!!"); nemen van de foto digitalWrite (8, hoge); Sluit de camera trigger delay(500); wachten op een tweede digitalWrite (8, laag); Koppel de camera trigger delay(500); panSteps = panSteps + 1; tiltSteps = tiltSteps + 1; driveSteps = driveSteps + 1; progStart = 0; }}} / / functie die wordt uitgevoerd wanneer gegevens wordt gevraagd door meester / / deze functie als een gebeurtenis is geregistreerd, Zie Setup void receiveEvent (int houder) {int index = 0; terwijl (1 < Wire.available()) / / doorlopen alle, maar de laatste {char c = Wire.read(); / / ontvangen byte als een teken / / Serial.print(c); / / print de karakter-dataRx [index ++] = c; dataRx [index] = '\0';} int x = Wire.read(); / / ontvangen byte als integer / / Serial.println(x); / / het gehele getal afdrukken als (* dataRx == 'a') {panX = x; Serial.Print ("OMG PARSEREN PANX:"); Serial.println(panX); } else if (* dataRx == 'b') {panZ = x; Serial.Print ("OMG PARSEREN PANZ:"); Serial.println(panZ); } else if (* dataRx == 'c') {tiltX = x; Serial.Print ("OMG PARSEREN TILTX:"); Serial.println(tiltX); } else if (* dataRx == had') {tiltZ = x; Serial.Print ("OMG PARSEREN TILTZ:"); Serial.println(tiltZ); } else if (* dataRx == "e") {driveX = x; Serial.Print ("OMG PARSEREN DRIVEX:"); Serial.println(driveX); } else if (* dataRx == 'f') {driveZ = x; Serial.Print ("OMG PARSEREN DRIVEZ:"); Serial.println(driveZ); } else if (* dataRx == 'g') {timeX = x; Serial.Print ("OMG PARSEREN TIMEX:"); Serial.println(timeX); } else if (* dataRx == 'h') {picZ = x; Serial.Print ("OMG PARSEREN PICZ:"); Serial.println(picZ); } else if (* dataRx == 'i') {progStart = x; Serial.Print ("OMG PARSEREN START:"); Serial.println(progStart); }} / * rendementen wijzigen in encoder staat (-1,0,1) * / int8_t read_encoder() {statische int8_t enc_states [] = {0, - 1,1,0,1,0,0, -1, - 1,0,0,1,0,1,-1,0}; statische uint8_t old_AB = 0; / ** / old_AB << = 2; //remember vorige staat old_AB | = (ENC_PORT & 0x03); //add huidige status terug (enc_states [(old_AB & 0x0f)]);} ongeldig callEncoder() {/ / analogWrite (motorPin, 0); / / delay(1000); / / / / //30Dst @ 150Sp / / //60Dst @ 75Sp / / //60Dst @ 50Sp / / / / terwijl (afstand < 240) {/ / analogWrite (motorPin 75); } statische uint8_t counter = 0; Deze variabele wordt gewijzigd door encoder input int8_t tmpdata; / ** / tmpdata = read_encoder(); Als (tmpdata) {/ / Serial.print ("Counter waarde:"); Serial.println (counter, DEC); teller += tmpdata; if(Counter == 255) {stateChange = 1;} if(counter == 0) {if(stateChange == 1) {stateChange = 0; afstand += 1; Serial.Print ("stappen:"); Serial.println (afstand, DEC); }}}} < br >