Arduino Candygrabber (3 / 9 steg)
Steg 3: Arduino
Funktionen setup() anropas när en skiss startar. Vi använder det för att initiera variabler, pin lägen och motorerna. Setup-funktionen kommer att bara köra en gång, efter varje makt upp eller återställning av Arduino styrelsen.
Nästa är loop funktion som startar, definierar inByte som byte variabel och tilldelar det värdet 255 och startar ett tag loop som kommer att köra tills det blir ett nollvärde (0) genom Serial.read(). Detta är viktigt så det vet att de tre nästa värden blir det är kommandot värdena. Om vi inte använder noll kommandona skulle få blandas ihop (t.ex. ibland värden SKIFT för en plats så istället för att flytta motorX det skulle flytta motorY). I while loop vi också kalla readInteruptors() fungerar så att den kan kontrollera om transport har nått en av gränslägesbrytarna och stoppa motorerna. När det blir en noll värde while loopen är avslutat och det börja läsa nästa tre värdena, och när det blir alla tre värden det anropar funktionen runMotors().
Funktionen runMotors() kontrollerar vilken riktning varje motor ska köras och även om transport på det gränser. Den enda återstående funktionen är stateChange() som utlöses när något faller i hålan. Skickar den ett meddelande om att du har vunnit till AIR app som sedan skickar det till den användare som spelar.
#include < AFMotor.h > int pinLDR = 5; int sensorPin = 7; int limitSwitch1 [2]; int limitSwitch2 [2]; int limitSwitch1PwrPIN = 28; int limitSwitch2PwrPIN = 30; int incomingByte [128]; int numBytes = 0; int motorSpeed = 0;
AF_DCMotor motorGrabber(1);
AF_DCMotor motorX(3);
AF_DCMotor motorY (4), volatileint stat = låg, void setup() {
attachInterrupt (pinLDR, TillståndÄndra, faller); int jag = 0;
limitSwitch1 [0] = 36.
limitSwitch1 [1] = 38.
limitSwitch2 [0] = 40;
limitSwitch2 [1] = 42. //Set pin modesfor (i = 0; i < 2; i ++) {
pinMode (limitSwitch1 [i], ingång);
pinMode (limitSwitch2 [i], ingång);}
pinMode(limitSwitch1PwrPIN,OUTPUT);
digitalWrite(limitSwitch1PwrPIN,HIGH);
pinMode(limitSwitch2PwrPIN,OUTPUT);
digitalWrite (limitSwitch2PwrPIN, hög), för (jag = 0; jag < 3; i ++) {
incomingByte [i] = 6;}
motorGrabber.setSpeed(255);
motorGrabber.run(RELEASE);
motorX.setSpeed(255);
motorX.run(RELEASE);
motorY.setSpeed(255);
motorY.run(RELEASE);
Serial.BEGIN(9600);} void loop() {int jag = 0;
byte inByte = 255; medan (inByte! = 0) {
inByte = Serial.read();
readInteruptors();} om (inByte ==0){while(Serial.available() < 3) {;} Läs alla data i bufferfor (i = 0; i < 3; i ++) {
incomingByte [i] = Serial.read();}
Serial.flush();}
runMotors();} void readInteruptors() {om ((incomingByte [0] < 6 & & digitalRead (limitSwitch1 [0]) == låg) || (incomingByte [0] > 6 & & digitalRead(limitSwitch1[1])==LOW)) {
incomingByte [0] = 6;
motorX.run(RELEASE);} om ((incomingByte [1] < 6 & & digitalRead (limitSwitch2 [0]) == låg) || (incomingByte [1] > 6 & & digitalRead(limitSwitch2[1])==LOW)) {
incomingByte [1] = 6;
motorY.run(RELEASE) ;}} void runMotors() {om (incomingByte [0] < 6 & & digitalRead(limitSwitch1[0])==HIGH) {
motorSpeed = map(incomingByte[0],5,1,0,255);
motorX.run(BACKWARD);
motorX.setSpeed(motorSpeed);} ElseIf (incomingByte [0] > 6 & & digitalRead(limitSwitch1[1])==HIGH) {
motorSpeed = map(incomingByte[0],7,11,0,255);
motorX.run(FORWARD);
motorX.setSpeed(motorSpeed);} annat {
incomingByte [0] = 6;
motorX.run(RELEASE);} om (incomingByte [1] < 6 & & digitalRead(limitSwitch2[0])==HIGH) {
motorSpeed = map(incomingByte[1],5,1,0,255);
motorY.run(BACKWARD);
motorY.setSpeed(motorSpeed);} ElseIf (incomingByte [1] > 6 & & digitalRead(limitSwitch2[1])==HIGH) {
motorSpeed = map(incomingByte[1],7,11,0,255);
motorY.run(FORWARD);
motorY.setSpeed(motorSpeed);} annat {
incomingByte [1] = 6;
motorY.run(RELEASE);} om (incomingByte [2] < 6) {
motorSpeed = map(incomingByte[2],5,1,0,255);
motorGrabber.run(BACKWARD);
motorGrabber.setSpeed(motorSpeed);} ElseIf (incomingByte [2] > 6) {
motorSpeed = map(incomingByte[2],7,11,0,255);
motorGrabber.run(FORWARD);
motorGrabber.setSpeed(motorSpeed);} annat {
incomingByte [2] = 6;
motorGrabber.run(RELEASE) ;}} void stateChange() {
Serial.println("win");
Serial.flush();}