(med Video) Grundläggande Arduino Robot, ljus sökare! (4 / 8 steg)
Steg 4: Införliva ljussensorer del 2
Av personlig preferens lik jag till har analogRead() fungera tillbaka 0(min) om ljussensorn är mörk, och 1023(max) om den upptäcker starkt ljus. Vi kan lösa detta problem med hjälp av programvara. Det finns inga förändringar i kretsen.
På denna del av koden:
SensorLeft = analogRead(LeftSensor);
Delay(1);
Vi kan lägga till:
SensorLeft = 1023 - analogRead(LeftSensor);
Delay(1);
Detta dras automatiskt oavsett värde analogRead() returneras av 1023 (som är max värdet den kan returnera.)
Detta sätt, kommer det att Invertera vad någonsin värde analogRead() avkastning.
Till exempel, om analogRead() värde är x
x = 0
Sensor värde = 1023 - x
Sensor värde = 1023-0
Sensor värde = 1023
x = 1023
Sensor värde = 1023 - x
Sensor värde = 1023-1023
Sensor värde = 0
Denna metod kan användas för att Invertera valfritt värde, så länge du vet det högsta värdet som returneras.
Till exempel, om en sensor returnerar maximalt 255:
Val = 255 - sensor värde
Ladda upp denna kod till Arduino styrelsen och prov den ute.
Kopiera koden från och med nu:
/****************************************************************************************************************
-Program för att läsa två LDRs
* skapade av: Anuj
* (c) copyright
*
*
* Fysiska installationen:
* Två LDRs ansluten till marken och Analog pin 1(Right) och Analog pin 2(left)
*
*
******************************************************************************************************************/
Med hjälp av Arduino Duemilinove
PIN definitioner - fäster en variabel till en PIN-kod.
CONST int RightMotor = 2; Detta stift används för att aktivera eller inaktivera rätt motor. Ansluten till basen av en NPN-transistor.
CONST int LeftMotor = 3; Detta stift används för att aktivera eller inaktivera vänstra motorn. Ansluten till basen av en NPN-transistor.
CONST int RightSensor = 1; Detta stift används för att läsa värdet för rätt sensorn.
CONST int LeftSensor = 2; Detta stift används för att läsa värdet på vänster sensorn.
Varierande definitioner
int SensorLeft; Detta lagrar värdet för vänster givarstaven att använda senare i skissen
int SensorRight; Här lagras värdet av rätt givarstaven att använda senare i skissen
metoden setup() körs när när programmet körs. När den
Arduino återställs, setup() kommer att genomföras en gång.
void setup() {
pinMode (LeftSensor, indata); Definierar detta stift som indata. Arduino läser värden från detta stift.
pinMode (RightSensor, indata); Definierar detta stift som indata. Arduino läser värden från detta stift.
digitalWrite (A1, hög); Gör en inre pullup motstånd
digitalWrite (A2, hög); Gör en inre pullup motstånd
Serial.BEGIN(9600); Kan en seriell anslutning via Arduino till antingen USB eller UART (stift 0 & 1). Observera att överföringshastigheten är inställd 9600
Serial.println ("\nReading ljussensorer."); Placeras i slutet av void Setup() så att det körs en gång, precis innan den ogiltiga Loop()
}
metoden loop() körs om och om igen,
så länge Arduino har makt
void loop() {
SensorLeft = analogRead(LeftSensor); Detta läser värdet i sensorn och sedan sparar den till motsvarande heltal.
Delay(1); fördröjningen kan den Analog till Digital omvandlaren IC att återhämta sig inför nästa behandlingen.
SensorRight = analogRead(RightSensor); Detta läser värdet i sensorn och sedan sparar den till motsvarande heltal.
Delay(1); fördröjningen kan den Analog till Digital omvandlaren IC att återhämta sig inför nästa behandlingen.
Detta avsnitt av skiss används för att skriva ut värdena i de
sensorer via seriell till datorn. Användbart för att bestämma
om sensorerna arbetar och om koden också fungerar.
Detta kallas felsökning.
Serial.Print ("vänster Sensor ="); Skriver ut texten i citat.
Serial.Print(SensorLeft); Skriver ut värdet på vänster sensorn.
Serial.Print("\t"); Skriver ut en flik (mellanslag).
Serial.Print ("rätt Sensor ="); Skriver ut texten i citat.
Serial.Print(SensorRight); Skriver ut värdet av rätt sensorn.
Serial.Print("\n"); Skriver ut en ny rad efter alla nödvändiga data visas.
}
Kopiera inte något utöver denna punkt.
Nu har vi till sensorer du använder med vår robot, men vi är inte riktigt klar ännu. Vi behöver ett sätt att jämföra dessa värden. Använder bara dessa värden, kan vi avgöra om en sensor läser en större eller mindre värde än andra sensorn, eller om de är exakt samma.
Nu, på grund av många andra faktorer såsom mindre avvikelser från LDR tillverkning, jitter, EMI, etc, värdena för ljussensorn kommer sällan vara exakt samma. Så istället kan vi använda ett annat heltal för att avgöra om de är ungefär samma. Vi kan uppnå detta med hjälp av beräkning av skillnaden mellan två ljussensorer. Vi kan dra av värdet av en sensor av värdet av andra sensorn och sedan hitta det absoluta värdet av sensorn. Detta returnerar differensen mellan två sensorer och vi kan använda som omedelbart, eller spara den på ett annat heltal, så att vi kan använda den mer än en gång. Det slutliga värdet kan användas för att avgöra om sensorerna läser två distinkta värden eller om de är något liknande. Ju högre värde, desto högre skillnaden. Använda en if sats, kan jag säga, om de sensorer värdena ligger inom 100 steg om varandra, gör detta.
om (SensorDifference < = 100) {
Utföra detta.
}
Åker snålskjuts av vår föregående kod som bör fortfarande vara igång på Arduino styrelsen,
Vi kan använda de två heltal som innehåller värdet av sensorerna till calculcate skillnaden och spara den på en ny heltal.
Den nya koden ser ut så här. Förändringarna är i fetstil.
/****************************************************************************************************************
-Program för att läsa två LDRs
* skapade av: Anuj
* (c) copyright
*
*
* Fysiska installationen:
* Två LDRs ansluten till marken och Analog pin 1(Right) och Analog pin 2(left)
*
*
******************************************************************************************************************/
Med hjälp av Arduino Duemilinove
PIN definitioner - fäster en variabel till en PIN-kod.
CONST int RightMotor = 2; Detta stift används för att aktivera eller inaktivera rätt motor. Ansluten till basen av en NPN-transistor.
CONST int LeftMotor = 3; Detta stift används för att aktivera eller inaktivera vänstra motorn. Ansluten till basen av en NPN-transistor.
CONST int RightSensor = 1; Detta stift används för att läsa värdet för rätt sensorn.
CONST int LeftSensor = 2; Detta stift används för att läsa värdet på vänster sensorn.
Varierande definitioner
int SensorLeft; Detta lagrar värdet för vänster givarstaven att använda senare i skissen
int SensorRight; Här lagras värdet av rätt givarstaven att använda senare i skissen
int SensorDifference; / / det här värdet används för att avgöra skillnaden mellan vänster och höger
metoden setup() körs när när programmet körs. När den
Arduino återställs, setup() kommer att genomföras en gång.
void setup() {
pinMode (LeftSensor, indata); Definierar detta stift som indata. Arduino läser värden från detta stift.
pinMode (RightSensor, indata); Definierar detta stift som indata. Arduino läser värden från detta stift.
digitalWrite (A1, hög); Gör en inre pullup motstånd
digitalWrite (A2, hög); Gör en inre pullup motstånd
Serial.BEGIN(9600); Kan en seriell anslutning via Arduino till antingen USB eller UART (stift 0 & 1). Observera att överföringshastigheten är inställd 9600
Serial.println ("\nReading ljussensorer."); Placeras i slutet av void Setup() så att det körs en gång, precis innan den ogiltiga Loop()
}
metoden loop() körs om och om igen,
så länge Arduino har makt
void loop() {
SensorLeft = analogRead(LeftSensor); Detta läser värdet i sensorn och sedan sparar den till motsvarande heltal.
Delay(1); fördröjningen kan den Analog till Digital omvandlaren IC att återhämta sig inför nästa behandlingen.
SensorRight = analogRead(RightSensor); Detta läser värdet i sensorn och sedan sparar den till motsvarande heltal.
Delay(1); fördröjningen kan den Analog till Digital omvandlaren IC att återhämta sig inför nästa behandlingen.
SensorDifference = abs(SensorRight = SensorLeft);
Detta avsnitt av skiss används för att skriva ut värdena i de
sensorer via seriell till datorn. Användbart för att bestämma
om sensorerna arbetar och om koden också fungerar.
Detta kallas felsökning.
Serial.Print ("vänster Sensor ="); Skriver ut texten i citat.
Serial.Print(SensorLeft); Skriver ut värdet på vänster sensorn.
Serial.Print("\t"); Skriver ut en flik (mellanslag).
Serial.Print ("rätt Sensor ="); Skriver ut texten i citat.
Serial.Print(SensorRight); Skriver ut värdet av rätt sensorn.
Serial.print("\t"); / / Prints en flik (mellanslag).
Serial.print ("Sensor skillnaden ="); Skriver ut texten innanför citattecknen.
Serial.Print(SensorDifference);
Serial.Print("\n"); Skriver ut en ny rad efter alla nödvändiga data visas.
}