Solar powered ficklampa kontrollerade mini tank robot!
Ficklampa kontrollerade Solar Powered Arduino aktiverad Robot
Detta projekt är en lätt lutning känsliga robot med solar laddning kapacitet, med andra ord det söker upp ljuset att ladda själv. Det åstadkommer detta beteende med en uppsättning av fyra ljus känsliga photoresistors i spänningsavdelare kretsar, Arduino enheten läser de fyra värden som motsvarar styrkan i det mottagna av sensorer genom dess analoga Läs stift. Sedan gäller det en hög spänning över en reed switch som avslutar en krets mellan ett 9v batteri och två leksak motorer, vilket resulterar i svarvning eller går mot ljuset. Dessa motorer var inte kan aktiveras direkt med Arduino, om du får små tillräckligt motorer, den kopplande delen av detta projekt får utelämnas utan funktionsnedsättning. Om någon av de fyra fotodioderna registrerar mycket högre än de andra, upptäcker det vilka fotodiod får ökad signalen och vänder eller rör sig i den riktningen för så länge ökad signalen tas emot. Detta ljus spårning algoritm kan användas till programmet solpaneler för att spåra på solen, eller för kontroll av robot via ficklampa, vilket framgår här.
Beskrivning
Bilder och diagram över hela kretskortet skulle vara lite rörigt i detta fall, alltså jag har boxed de viktigaste komponenterna som upprepas 4 och 2 gånger respektive i det faktiska projektet. Den första kretsen subsystem är spänningsavdelare utifrån ett fotomotstånd som upprepas fyra gånger, med varje fotomotstånd som släpps ut på en annan sida av din robot. Ett fotomotstånd varierar motstånd baserat på ljus signal som tas emot via photoconductivity av den mottagande halvledarmaterial. Det variabla motståndet producerar en variabel strömmen i kretsen enligt Ohms lag, V = iR där spänning V är konstant (5V). Var försiktig att inte trådarna leder till någon en fotodiod alltför långa, eftersom du kan förlora signal på grund av det inre motståndet av tråd och lödning anslutningar. Spänning levereras till denna del av kretsen direkt från Arduino UNO'S 5V / Gnd stift. 5V linjen passerar genom ett 10kΩ motstånd, genom fotodiod, och tillbaka till marken. En analog i signalen läses från mellan resistorn och fotodiod via Arduino analog i stiften. Ett valfritt tillägg är indikatorn LED visas kommer från andra sidan av motståndet (positiv) till marken (negativ), denna LED kommer att ändra intensitet baserat på den signal som tas emot av fotodiod. Dessa lysdioder är för nära en av fotodioderna, din maskin kan ange en slags analog återkoppling i den riktningen, där det snurrar i riktning mot sin egen lysdioder. Jag tror jag har kodat mot denna möjlighet, men om du ser detta beteende, prova att ta lysdioderna ut som de är användbara endast medan felsökning denna del av banan. Fyra analoga i pins ska anslutas till fyra upprepningar av denna krets block. I princip kan du öka antalet iterationer för ökad riktad känslighet, men detta är inte nödvändigt för det här programmet. Den skiss som går med detta projekt är känslig för en skillnad i mottagna ljusintensitet, om alla de signaler som tas emot är mycket lika, roboten kommer att fortsätta att prova dess miljö, men förbli stillastående. Så snart någon av signalerna som är större än de andra av ett tröskelvärde, fylls i dess rörelse loop. Det avgör vilka fotomotstånd får maximal signalen och tillämpar sedan strömmen till motorn som flyttar roboten i rätt motsvarande riktning. Den här åtgärden fortsätter så länge det fotomotstånd får maximal intensitet, och det finns en tillräckligt stor skillnad mellan Läs värdena.
Den andra blockerade delen av kretsen är bara nödvändigt om du behöver mer makt till motorerna då Arduino kan leverera direkt från dess PWM utdata stift. Mitt chassi / låtar / motor från en kinesisk leksak, Arduino har problem med att köra motorerna med spår på, så jag byggde i en byta block att den krets som gör PWM utdata till vända en reed-relä som slutför en krets till ett 9V batteri. Reed reläfungerar via en elektromagnet som när aktiveras av lägre nuvarande (Arduino) orsakar kontaktpunkterna inom växeln att bli magnetiserat och stänga banan. I princip kan du köra mycket stora elmotorer med detta begrepp genom att välja rätt rörblad reläet. Jag behövde inte mycket mer makt, så ett 9V batteri var gott, växeln jag använt är i delar så att avsnitt. Eftersom denna komponent drivs via elektromagnetiska fältet, en övergående skydd diod är nödvändigt, eftersom det kollapsande magnetfältet (när växeln är avstängd) kan orsaka en nuvarande toppar resa tillbaka mot Arduino som förutspådde av Maxwells ekvationer. En bra diskussion om hur man genomför denna särskilda reed relä växlar utan orsakar skador på din styrelse kan hittas här.
Denna del av kretsen upprepas två gånger motsvarar två motorer, och som sagt, om du kan driva din motors direkt med Arduino, du kan utelämna denna del av projektet utan funktionsnedsättning.
Kopplingsschema
Spänningsavdelare:
Byta krets:
Reservdelslista
Arduino UNO ($14.48)
4 x Resistor, 10 KΩ
4 x foto ljus känsliga Resistor fotomotstånd Optoresistor 5mm GL5516 5516
4 x LED
RadioShack® 1.5W solpanel 9V ($5,74)
Toy spår / plattform / motorer (2)
2 x reedbrytare (OMR-C - 105H)
Koden
CONST int frontPin = A0;
CONST int leftPin = A1;
CONST int rightPin = A2;
CONST int backPin = A3;
CONST int leftMotor = 9;
CONST int rightMotor = 10;
int tröskelvärdet = 170;
int riktning;
int direction1;
int direction2;
int dröjsmål = 25;
int Delay2 = 25;
void setup()
{
pinMode (frontPin, ingång);
pinMode (leftPin, ingång);
pinMode (rightPin, ingång);
pinMode (backPin, ingång);
pinMode (leftMotor, produktionen);
pinMode (rightMotor, produktionen);
digitalWrite (leftMotor, hög);
digitalWrite(rightMotor,HIGH);
Delay(100);
digitalWrite (leftMotor, låg);
digitalWrite (rightMotor, låg);
Delay(100);
digitalWrite (leftMotor, hög);
digitalWrite (rightMotor, hög);
Delay(100);
digitalWrite (leftMotor, låg);
digitalWrite (rightMotor, låg);
Delay(1500);
Serial.BEGIN(9600);
}
void loop()
{
int riktning;
int direction1;
int direction2;
int frontSignal = 1023 - analogRead(frontPin);
int leftSignal = 1023 - analogRead(leftPin);
int rightSignal = 1023 - analogRead(rightPin);
int backSignal = 1023 - analogRead(backPin);
Serial.println(frontSignal);
Serial.println(leftSignal);
Serial.println(rightSignal);
Serial.println(backSignal);
frontSignal + leftSignal + rightSignal + backSignal < = tröskelvärdet
om (abs(frontSignal-leftSignal)+abs(frontSignal-rightSignal)+abs(frontSignal-backSignal) > = tröskelvärdet)
{
Serial.println ("motion loop");
direction1 = max (frontSignal, leftSignal);
direction2 = max (rightSignal, backSignal);
Riktning = max (direction1, direction2);
Loop här anges endast om ljuset emot är inte jämnt fördelad.
om (frontSignal == riktning)
{
göra
{
digitalWrite (leftMotor, hög);
digitalWrite (rightMotor, hög);
Delay(Delay2);
digitalWrite (leftMotor, låg);
digitalWrite (rightMotor, låg);
Delay(delay);
frontSignal = 1023 - analogRead(frontPin);
leftSignal = 1023 - analogRead(leftPin);
rightSignal = 1023 - analogRead(rightPin);
backSignal = 1023 - analogRead(backPin);
direction1 = max (frontSignal, leftSignal);
direction2 = max (rightSignal, backSignal);
Riktning = max (direction1, direction2);
Serial.println("forward");
} medan (frontSignal == riktning & & abs(frontSignal-leftSignal)+abs(frontSignal-rightSignal)+abs(frontSignal-backSignal) > = tröskelvärdet);
digitalWrite (leftMotor, låg);
digitalWrite (rightMotor, låg);
}
annat if (leftSignal == riktning) //Signal är störst till vänster
{
göra
{
Serial.println("left");
digitalWrite (rightMotor, hög);
Delay(Delay2);
digitalWrite (rightMotor, låg);
Delay(delay);
frontSignal = 1023 - analogRead(frontPin);
leftSignal = 1023 - analogRead(leftPin);
rightSignal = 1023 - analogRead(rightPin);
backSignal = 1023 - analogRead(backPin);
direction1 = max (frontSignal, leftSignal);
direction2 = max (rightSignal, backSignal);
Riktning = max (direction1, direction2);
} medan (leftSignal == riktning & & abs(frontSignal-leftSignal)+abs(frontSignal-rightSignal)+abs(frontSignal-backSignal) > = tröskelvärdet);
digitalWrite (rightMotor, låg);
}
annat if (rightSignal == riktning) //Signal är störst till höger.
{
göra
{
Serial.println("Right");
digitalWrite (leftMotor, hög);
Delay(Delay2);
digitalWrite (leftMotor, låg);
Delay(delay);
frontSignal = 1023 - analogRead(frontPin);
leftSignal = 1023 - analogRead(leftPin);
rightSignal = 1023 - analogRead(rightPin);
backSignal = 1023 - analogRead(backPin);
direction1 = max (frontSignal, leftSignal);
direction2 = max (rightSignal, backSignal);
Riktning = max (direction1, direction2);
} medan (rightSignal == riktning & & abs(frontSignal-leftSignal)+abs(frontSignal-rightSignal)+abs(frontSignal-backSignal) > = tröskelvärdet);
digitalWrite (leftMotor, låg);
}
annars om (backSignal == riktning) //Signal är största bakom.
{
göra
{
Serial.println("back");
digitalWrite (leftMotor, hög);
Delay(Delay2);
digitalWrite (leftMotor, låg);
Delay(delay);
frontSignal = 1023 - analogRead(frontPin);
leftSignal = 1023 - analogRead(leftPin);
rightSignal = 1023 - analogRead(rightPin);
backSignal = 1023 - analogRead(backPin);
direction1 = max (frontSignal, leftSignal);
direction2 = max (rightSignal, backSignal);
Riktning = max (direction1, direction2);
} medan (backSignal == riktning & & abs(frontSignal-leftSignal)+abs(frontSignal-rightSignal)+abs(frontSignal-backSignal) > = tröskelvärdet);
digitalWrite (leftMotor, låg);
}
}
annat if(abs(frontSignal-leftSignal)+abs(frontSignal-rightSignal)+abs(frontSignal-backSignal) < = tröskelvärdet)
{
int skillnaden = abs(frontSignal-leftSignal)+abs(frontSignal-rightSignal)+abs(frontSignal-backSignal);
Serial.println ("Signal differential är lika med");
Serial.println(Difference);
digitalWrite (leftMotor, låg);
digitalWrite (rightMotor, låg);
Delay(1000); Annars prova miljö med en hastighet av 10 hz
}
annat
{
digitalWrite (leftMotor, låg);
digitalWrite (rightMotor, låg);
}
}