Paso 28: Programa los Arduinos
Añadir este código para el Arduino controlar la pantalla táctil:
Controlador de pantalla de tactil cámara plataforma #include < Wire.h > #include < Adafruit_GFX.h > / / base biblioteca de gráficos #include < Adafruit_TFTLCD.h > / / Hardware específico biblioteca #include < TouchScreen.h > #if defined(__SAM3X8E__) #undef __FlashStringHelper::F(string_literal) #define F(string_literal) string_literal #endif #ifndef USE_ADAFRUIT_SHIELD_PINOUT #error "este bosquejo está diseñado para uso con la pantalla de LCD de TFT. Asegúrese de que USE_ADAFRUIT_SHIELD_PINOUT es #defined en el archivo de biblioteca de Adafruit_TFTLCD.h."#endif / / estos son los pines para el escudo! #define YP A1 / / debe ser un pin analógico, utilice "Una" notación! #define A2 XM / / debe ser un pin analógico, utilice "Una" notación! #define 7 YM / puede ser un pin digital #define XP 6 / / puede ser un pin digital #ifdef __SAM3X8E__ #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 / / para una mejor precisión de la presión, tenemos que saber la resistencia / / entre X + y X - uso cualquier multímetro para leer / / la versión que estamos usando , sus 300 ohmios a través de la X de la placa con pantalla táctil ts = pantalla táctil (XP, YP, XM, YM, 300); #define LCD_CS A3 #define LCD_CD A2 #define LCD_WR A1 #define LCD_RD A0 / / asignar nombres legibles a algunos valores de color de 16 bits comunes: #define negro 0 x 0000 #define azul 0x001F #define rojo 0xF800 #define verde 0x07E0 #define cian 0x07FF #define MAGENTA 0xF81F #define amarillo 0xFFE0 #define blanco 0xFFFF #define LBLUE 0x65FF Adafruit_TFTLCD tft; int oldcolor, currentcolor; bool pan = 1; int panPosition1 = 20; int panPosition2 = 20; bool inclinación = 0; int tiltPosition1 = 20; int tiltPosition2 = 20; bool unidad = 0; int drivePosition1 = 20; int drivePosition2 = 20; bool tiempo = 0; int timePosition1 = 20; int timePosition2 = 20; int startSend = 0; int x; void setup(void) {Wire.begin(); / / Únete i2c bus (opcional para el master de dirección) Serial.begin(9600); tft.reset(); uint16_t identificador = tft.readID(); if(identifier == 0x9325) {Serial.println (F ("driver encontrado ILI9325 LCD"));} otro if(identifier == 0x9328) {Serial.println (F ("driver encontrado ILI9328 LCD"));} más if(identifier == 0x7575) {Serial.println (F ("driver encontrado HX8347G LCD"));} otro {Serial.print (F ("chip controlador de LCD desconocido:")); Serial.println (identificador, hexagonal); retorno; } tft.begin(identifier); tft.setRotation(1); tft.fillScreen(BLACK); drawMenu(); tft.drawRect (0, 0, 58, 40, blanco); Set cursor inicial Estados tft.drawRect (19, 89, 272, 6, blanco); tft.fillRect (20, 90, 270, 4, amarilla); tft.drawRect (panPosition1, 71, 17, 42, blanco); tft.fillRect ((panPosition1 + 1), 72, 15, 40, MAGENTA); tft.drawRect (19, 169, 272, 6, blanco); tft.fillRect (20, 170, 270, 4, amarilla); tft.drawRect (panPosition2, 151, 17, 42, blanco); tft.fillRect ((panPosition2 + 1), 152, 15, 40, MAGENTA); currentcolor = rojo; pinMode (13, salida); } #define MINGRADO 10 #define MAXPRESSURE 1000 void loop() {digitalWrite (13, HIGH); Punto p = ts.getPoint(); digitalWrite (13, bajo); compartiendo pins, usted necesitará fijar las direcciones de la pantalla táctil pines pinMode (XM, salida); pinMode (YP, salida); tenemos cierta presión mínima que consideramos 'válidos' / / presión de 0 no significa presionar! Si (p.z > MINGRADO & & p.z < MAXPRESSURE) {/ / escala de 0 -> 1023 a tft.width p.x = mapa (p.x, TS_MINX, TS_MAXX, tft.width(), 0); py = mapa (PY, TS_MINY, TS_MAXY, tft.height(), 0); / / *** / superior menú selección código!!! / / *** si (p.x > 300) {oldcolor = currentcolor; si (PY < 58) {currentcolor = rojo; tft.drawRect (0, 0, 58, 40, blanco); pan = 1; inclinación = 0; unidad = 0; tiempo = 0; drawSliders();} else if (PY < 140) {currentcolor = LBLUE; tft.drawRect (58 0, 82, 40, BLANCO); pan = 0; inclinación = 1; unidad = 0; tiempo = 0; drawSliders(); } else if (PY < 180) {currentcolor = azul; tft.drawRect (140, 0, 96, 40, blanco); pan = 0; inclinación = 0; unidad = 1; tiempo = 0; drawSliders();} else if (PY < 240) {currentcolor = verde; tft.drawRect (0, 82, 236, 40, blanco); pan = 0; inclinación = 0; unidad = 0; tiempo = 1; drawSliders();}} //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! NECESITO ESTO EN TODO??? PUEDE LEER MENÚ??? Si (oldcolor! = currentcolor) {si (oldcolor == rojo) drawMenu(); si (oldcolor == LBLUE) drawMenu(); si (oldcolor == verde) drawMenu(); si (oldcolor == azul) drawMenu();} / / *** / / comienzo selección código!!!!!! Si (p.x < 40) {si (PY > 180) {tft.drawRect (220, 200, 96, 40, blanco); startSend = 1;}} / / *** //SLIDER código!!!!!! //Top SLIDER si (p.x > 180 & & p.x < 260) {si (PY < 350) {si (PY > = 20) {/ / o así que... para el primer negro cuadrados... reasignación de //need inferior y superior reasignación!!!!! py = mapa (PY, 240, 0, 0, 300); tft.fillRect (10, 71, (PY - 10), negro, 50); } tft.drawRect ((p.y-1), 71, 17, 42, blanco); tft.fillRect (PY, 72, 15, 40, MAGENTA); tft.fillRect ((p.y + 16), 71, (282 - py), negro, 50); tft.drawRect ((p.y + 15), 89, (272 - py), blanco 6,); tft.fillRect ((p.y + 16), 90, (270 - py), 4, amarillo); tft.drawRect (19, 89, (PY - 19), 6, blanco); tft.fillRect (20, 90, (PY - 20), 4, amarillo); Si (pan == 1) {panPosition1 = py; / / Serial.println(panPosition1);} else if(tilt == 1) {tiltPosition1 = py;} otro if(drive == 1) {drivePosition1 = py;} más if(time == 1) {timePosition1 = py;}} } //BOTTOM SLIDER si (p.x > 80 & & p.x < 160) {si (PY < 350) {si (PY > = 20) {/ / o así que... para el primer negro cuadrados... reasignación de //need inferior y superior reasignación!!! py = mapa (PY, 240, 0, 0, 300); tft.fillRect (10, 151, (PY - 10), 50, negro);} tft.drawRect ((p.y-1), 151, 17, 42, blanco); tft.fillRect (PY, 152, 15, 40, MAGENTA); tft.fillRect ((PY + 16) 151, (282 - py), negro, 50); tft.drawRect ((p.y + 15), 169, (272 - py), blanco 6,); tft.fillRect ((p.y + 16), 170, (270 - py), 4, amarillo); tft.drawRect (19, 169, (PY - 19), 6, blanco); tft.fillRect (20, 170, (PY - 20), 4, amarillo); Si (pan == 1) {panPosition2 = py; Serial.println(panPosition2); } else if(tilt == 1) {tiltPosition2 = py;} else if(drive == 1) {drivePosition2 = py;} else if(time == 1) {timePosition2 = py;}} } / / *** //TRANSMITS a otro ARDUINO / / *** if(startSend == 1) {transmitValues(); startSend = 0; delay(2000); drawMenu(); si (pan == 1) tft.drawRect (0, 0, 58, 40, blanco); si (inclinación == 1) tft.drawRect (0, 82, 58, 40, blanco); si (unidad == 1) tft.drawRect (140, 0, 96, 40, blanco); si (tiempo == 1) tft.drawRect (0, 82, 236, 40, blanco);}} } void transmitValues() {Wire.beginTransmission(2); / / transmitir al dispositivo #2 x = panPosition1; Wire.Write("a"); envía cinco bytes Wire.write(x); Wire.endTransmission(); interrumpir la transmisión a delay(100); Wire.beginTransmission(2); transmitir al dispositivo #2 x = panPosition2; Wire.Write("b"); envía cinco bytes Wire.write(x); Wire.endTransmission(); interrumpir la transmisión a delay(100); Wire.beginTransmission(2); transmitir al dispositivo #2 x = tiltPosition1; Wire.Write("c"); Wire.Write(x); Wire.endTransmission(); interrumpir la transmisión a delay(100); Wire.beginTransmission(2); transmitir al dispositivo #2 x = tiltPosition2; Wire.Write("d"); Wire.Write(x); Wire.endTransmission(); interrumpir la transmisión a delay(100); Wire.beginTransmission(2); transmitir al dispositivo #2 x = drivePosition1; Wire.Write("e"); envía cinco bytes Wire.write(x); Wire.endTransmission(); interrumpir la transmisión a delay(100); Wire.beginTransmission(2); transmitir al dispositivo #2 x = drivePosition2; Wire.Write("f"); envía cinco bytes Wire.write(x); Wire.endTransmission(); interrumpir la transmisión a delay(100); Wire.beginTransmission(2); transmitir al dispositivo #2 x = timePosition1; Wire.Write("g"); Wire.Write(x); Wire.endTransmission(); interrumpir la transmisión a delay(100); Wire.beginTransmission(2); transmitir al dispositivo #2 x = timePosition2; Wire.Write("h"); Wire.Write(x); Wire.endTransmission(); interrumpir la transmisión a delay(100); Wire.beginTransmission(2); transmitir al dispositivo #2 x = startSend; Wire.Write("i"); Wire.Write(x); Wire.endTransmission(); parada de transmisión} void drawSliders() {si (oldcolor ! = currentcolor) {tft.fillRect (10, 60, 300, 200, negro);} if(pan == 1) {tft.drawRect (19, 89, 272, 6, blanco); tft.fillRect (20, 90, 270, 4, amarillo); tft.drawRect (panPosition1, 71, 17, 42, blanco); tft.fillRect ((panPosition1 + 1) 72, 15, 40, MAGENTA); tft.drawRect (19, 169, 272, 6, blanco); tft.fillRect (20, 170, 270, 4, amarillo); tft.drawRect (panPosition2, 151, 17, 42, blanco); tft.fillRect ((panPosition2 + 1), 152, 15, 40, MAGENTA);} else if(tilt == 1) {tft.drawRect (19 89, 272, 6, BLANCO); tft.fillRect (20, 90, 270, 4, amarilla); tft.drawRect (tiltPosition1, 71, 17, 42, blanco); tft.fillRect ((tiltPosition1 + 1), 72, 15, 40, MAGENTA); tft.drawRect (19, 169, 272, 6, blanco); tft.fillRect (20, 170, 270, 4, amarilla); tft.drawRect (tiltPosition2, 151, 17, 42, blanco); tft.fillRect ((tiltPosition2 + 1), 152, 15, 40, MAGENTA); } else if(drive == 1) {tft.drawRect (19, 89, 272, 6, blanco); tft.fillRect (20, 90, 270, 4, amarillo); tft.drawRect (drivePosition1, 71, 17, 42, blanco); tft.fillRect ((drivePosition1 + 1) 72, 15, 40, MAGENTA); tft.drawRect (19, 169, 272, 6, blanco); tft.fillRect (20, 170, 270, 4, amarillo); tft.drawRect (drivePosition2, 151, 17, 42, blanco); tft.fillRect ((drivePosition2 + 1) 152, 15, 40, MAGENTA);} más if(time == 1) {tft.drawRect (19, 89 272, 6, BLANCO); tft.fillRect (20, 90, 270, 4, amarilla); tft.drawRect (timePosition1, 71, 17, 42, blanco); tft.fillRect ((timePosition1 + 1), 72, 15, 40, MAGENTA); tft.drawRect (19, 169, 272, 6, blanco); tft.fillRect (20, 170, 270, 4, amarilla); tft.drawRect (timePosition2, 151, 17, 42, blanco); tft.fillRect ((timePosition2 + 1), 152, 15, 40, MAGENTA); }} void drawMenu() {tft.fillRect (0, 82, 236, 40, verde); tft.fillRect (140, 0, 96, 40, azul); tft.fillRect (0, 82, 58, 40, LBLUE); tft.fillRect (0, 0, 58, 40, rojo); tft.drawChar (2, 10, 'P', blanco, rojo, 3); tft.drawChar (20, 10, 'A', blanco, rojo, 3); tft.drawChar (38, 10, ' n ', blanco, rojo, 3); tft.drawChar (64, 10, ' t ', blanco, LBLUE, 3); tft.drawChar (82, 10, 'I', blanco, LBLUE, 3); tft.drawChar (100 EL 10, L, BLANCO, LBLUE, 3); tft.drawChar (118, 10, ' t ', blanco, LBLUE, 3); tft.drawChar (144, 10, sería ', blanco, azul, 3); tft.drawChar (162, 10, R, blanco, azul, 3); tft.drawChar (180, 10, 'I', blanco, azul, 3); tft.drawChar (198, 10, 'V', blanco, azul, 3); tft.drawChar (216, 10, 'E', blanco, azul, 3); tft.drawChar (242, 10, ' t ', blanco, verde, 3); tft.drawChar (260, 10, 'I', blanco, verde, 3); tft.drawChar (278, 10, am', blanco, verde, 3); tft.drawChar (296, 10, 'E', blanco, verde, 3); tft.fillRect (220, 200, 96, 40, azul); tft.drawChar (224, 210, de ', blanco, azul, 3); tft.drawChar (242, 210, ' t ', blanco, azul, 3); tft.drawChar (260, 210, 'A', blanco, azul, 3); tft.drawChar (278, 210, R, blanco, azul, 3); tft.drawChar (296, 210, ' t ', blanco, azul, 3); } < br >
Añadir este código para el Arduino que será controlar el motor:
Cámara controlador Motor plataforma #include < Servo.h > #define ENC_A 14 #define ENC_B 15 #define ENC_PORT PINC Servo panServo; Servo tiltServo; int distancia = 0; bool estadoCambiar = 0; motorPin int = 3; LED conectado al pin digital 9 flotador driveX = 0; Float tiltX = 0; panX del flotador = 0; timeX de flotador = 0; driveZ del flotador = 0; Float tiltZ = 0; panZ de flotador = 0; picZ de flotador = 0; int distanceToGo = 0; para programa int progStart = 0; para pruebas progStart //int = 1; int motorSpeed; Float totalTilt; Float totalPan; Float totalDrive; Float panIncrement; Float tiltIncrement; Float driveIncrement; Float picsPerPanIncrement = 1; Float picsPerTiltIncrement = 1; Float picsPerDriveIncrement = 1; int panSteps = 0; int tiltSteps = 0; int driveSteps = 0; dataRx Char [20]; #include < Wire.h > void setup() {Wire.begin(2); / / Únete a bus i2c con dirección 2 # Wire.onReceive(receiveEvent); / / registro de eventos Serial.begin(9600); / / start de serie para salida panServo.attach(4) tiltServo.attach(5); tiltServo.writeMicroseconds(1100); panServo.writeMicroseconds(1500); delay(10000); pinMode (8, salida); pinMode (ENC_A, entrada); digitalWrite (ENC_A alta); pinMode (ENC_B, entrada); digitalWrite (ENC_B, alto);} void loop() {if(progStart == 1) {tiltX = mapa (tiltX 0, 255, 750, 1450); tiltZ = mapa (tiltZ, 0, 255, 750, 1450); panX = mapa (panX, 0, 255, 600, 2200); panZ = mapa (panZ, 0, 255, 600, 2200); Serial.println(panX); Serial.println(panZ); if(timeX < 5) {motorSpeed = 150; driveX = (driveX, 180, 0, 0, 255); timeX = 0;} else {motorSpeed = 75; driveX = (driveX, 255, 0, 0, 360);} totalPan = (panX - panZ); totalPan = abs(totalPan); totalTilt = tiltX - tiltZ; totalTilt = abs(totalTilt); totalDrive = driveX; Serial.println(totalPan); //Figure cómo ahora avanzar antes de tomar fotos / / alternativamente, cuántas fotos para tomar antes de avanzar / / *** / / ¡!!!!!!!!!!!!!!!!!! ESTOS DEBEN SER CARROZAS DE MIERDA Y MIERDA! //! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 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 servos en las posiciones iniciales / / *** tiltServo.writeMicroseconds(tiltX); panServo.writeMicroseconds(panX); Delay(10000); //Take algunas fotos y algunas cosas / / *** para (int takingPictures = 0; takingPictures < picZ; takingPictures ++) {si (panSteps > = picsPerPanIncrement) {if(panX > panZ) {panServo.writeMicroseconds (panX - panIncrement); panX = panX - panIncrement;} otra cosa if(panX < panZ) {panServo.writeMicroseconds (panX + panIncrement); panX panX = panIncrement;} Else {panServo.writeMicroseconds(panX);} panSteps = 0; } Si (tiltSteps > = picsPerTiltIncrement) {if(tiltX > tiltZ) {tiltServo.writeMicroseconds (tiltX - tiltIncrement); tiltX = tiltX - tiltIncrement;} otra cosa if(tiltX < tiltZ) {tiltServo.writeMicroseconds (tiltX + tiltIncrement); tiltX = tiltX + tiltIncrement;} Else {tiltServo.writeMicroseconds(tiltX);} tiltSteps = 0; } Si (driveSteps > = picsPerDriveIncrement) {analogWrite (motorPin, motorSpeed) while(distance < distanceToGo) {callEncoder();} analogWrite (motorPin, 0); driveSteps = 0;} distanceToGo = distanceToGo + driveIncrement; Delay(timeX * 500); Serial.println ("SHOOT!!!"); tomar foto digitalWrite (8, HIGH); Conecte la cámara disparador delay(500); Espere un segundo digitalWrite (8, bajo); Desconecte la cámara disparador delay(500); panSteps = panSteps + 1; tiltSteps = tiltSteps + 1; driveSteps = driveSteps + 1; progStart = 0; }}} / / función que se ejecuta siempre que se soliciten por el maestro / / esta función se registra como un evento, ver receiveEvent void setup() (soporte de int) {int index = 0; mientras que (1 < Wire.available()) / / recorrer todos pero el último {char c = Wire.read(); / / recibir el byte como un carácter / / Serial.print(c); / / imprimir el carácter dataRx [índice ++] = c; dataRx [índice] = '\0';} int x = Wire.read(); / / recibir el byte como un número entero / / Serial.println(x); / / imprimir el entero si (* dataRx == 'a') {panX = x; Serial.Print ("OMG análisis PANX:"); Serial.println(panX); } else if (* dataRx == 'b') {panZ = x; Serial.Print ("OMG análisis PANZ:"); Serial.println(panZ); } else if (* dataRx == 'c') {tiltX = x; Serial.Print ("OMG TILTX de análisis:"); Serial.println(tiltX); } else if (* dataRx == había ') {tiltZ = x; Serial.Print ("OMG TILTZ de análisis:"); Serial.println(tiltZ); } else if (* dataRx == 'e') {driveX = x; Serial.Print ("OMG análisis DRIVEX:"); Serial.println(driveX); } else if (* dataRx == 'f') {driveZ = x; Serial.Print ("OMG análisis DRIVEZ:"); Serial.println(driveZ); } else if (* dataRx == 'g') {timeX = x; Serial.Print ("OMG análisis TIMEX:"); Serial.println(timeX); } else if (* dataRx == 'h') {picZ = x; Serial.Print ("OMG PICZ de análisis:"); Serial.println(picZ); } else if (* dataRx == 'i') {progStart = x; Serial.Print ("OMG análisis inicial:"); Serial.println(progStart); }} / * Devuelve cambio en estado del encoder (-1,0,1) * / int8_t read_encoder() {int8_t estática enc_states [] = {0, 1,1,0,1,0,0, -1, 1,0,0,1,0,1,-1,0}; estático uint8_t old_AB = 0; / ** / old_AB << = 2; //remember estado previa old_AB | = (ENC_PORT & 0 x 03); //add estado actual retorno (enc_states [(old_AB & 0x0f)]);} void callEncoder() {/ / analogWrite (motorPin, 0); / / delay(1000); / / / / //30Dst a 150Sp / / //60Dst a 75PS / / //60Dst a 50Sp / / / / mientras (distancia < 240) {/ / analogWrite (motorPin 75); } uint8_t estática contador = 0; Esta variable será cambiada por codificador int8_t entrada tmpdata; / ** / tmpdata = read_encoder(); Si (tmpdata) {/ / Serial.print ("contador valor:"); Serial.println (contador, DEC); contador += tmpdata; if(Counter == 255) {estadoCambiar = 1;} if(counter == 0) {if(stateChange == 1) {estadoCambiar = 0; distancia += 1; Serial.Print ("incrementos:"); Serial.println (distancia, DEC); }}}} < br >