Sängkamrat Robot Bed (63 / 74 steg)
Steg 63: kod
Okej - så - när du arbetar med kod det är perfekt att använda något liknande Github att hålla reda på ändringar. Jag gör inte detta. Alltså skrev jag av misstag över den senaste fungerande versionen av koden. Jag har den senast sparade versionen, men jag är inte säker på hur komplett det är. Det är sannolikt lite buggig.
Novertheless, eftersom ingen av er kommer sannolikt att bygga det här någon som sätt, och sängen är för närvarande i bitar och inte fungerar, jag kommer bara att lägga upp vad jag har.
Jag delar också Provningsmetod för att manuellt kontrollera motorerna. Om du tittar på detta projekt för gränsyta en Arduino till mycket stora motorer via en Alltrax motor controller, kommer att här koden vara mer användbar för dig ändå.
Senast sparade versionen av Robot Bed Provningsmetod:
/*
Denna exempelkod är offentlig.
*/
upprätta spjäll pins
int leftThrottle = 3; LED är ansluten till digital pin 9
int rightThrottle = 5; LED är ansluten till digital pin 9
upprätta magnetventil pins
int leftOn = 7. LED är ansluten till digital pin 9
int rightOn = 8; LED är ansluten till digital pin 9
upprätta contactor pins
int leftReverse = 9;
int rightReverse = 10;
Körhastighet skickas till gasen
int gospeed = 86.
flyktiga int foserious = 0;
FRAMSIDAN
int FrontLeftSnd = 30.
int FrontLeftRcv = 31;
int FrontCenterSnd = 32.
int FrontCenterRcv = 33.
int FrontRightSnd = 34.
int FrontRightRcv = 35.
HÖGER SIDA
int Side1LeftSnd = 36.
int Side1LeftRcv = 37.
int Side1CenterSnd = 38.
int Side1CenterRcv = 39.
int Side1RightSnd = 40;
int Side1RightRcv = 41;
TILLBAKA
int BackLeftSnd = 42.
int BackLeftRcv = 43;
int BackCenterSnd = 44.
int BackCenterRcv = 45;
int BackRightSnd = 46.
int BackRightRcv = 47;
VÄNSTER SIDA
int Side2LeftSnd = 49.
int Side2LeftRcv = 48.
int Side2CenterSnd = 51.
int Side2CenterRcv = 50;
int Side2RightSnd = 53;
int Side2RightRcv = 52;
matris för alla inkommande och utgående stift namn. Senare brukade läsa alla sensorer i en for-loop.
int SensorOutputs [] = {FrontLeftSnd, FrontCenterSnd, FrontRightSnd, Side1LeftSnd, Side1CenterSnd, Side1RightSnd, BackLeftSnd, BackCenterSnd, BackRightSnd, Side2LeftSnd, Side2CenterSnd, Side2RightSnd};
int SensorInputs [] = {FrontLeftRcv, FrontCenterRcv, FrontRightRcv, Side1LeftRcv, Side1CenterRcv, Side1RightRcv, BackLeftRcv, BackCenterRcv, BackRightRcv, Side2LeftRcv, Side2CenterRcv, Side2RightRcv};
int dontgo = 0;
antalet totala sensorer
int SensorCount = 12;
int nothingHappening = 0;
int realCloseLike = 0;
int goingforward = 0;
int goingbackward = 0;
int goingright = 0;
int goingleft = 0;
int backhit = 0;
int fronthit = 0;
int righthit = 0;
int lefthit = 0;
int amountToMove = 1000;
int plockade;
void setup() {
(CLI); //stop avbrott
TCCR1A = 0; / / Ställ in hela TCCR1A register till 0
TCCR1B = 0; / / samma för TCCR1B
TCNT1 = 0; //initialize värde till 0
Set jämför match registrera för 1hz steg
OCR1A = 512; / / = (16 * 10 ^ 6) / (1 * 1024) - 1 (måste vara < 65536)
Aktivera CTC läge
TCCR1B | = (1 << WGM12);
Anger CS10 och CS12 bitar för 1024 prescaler
TCCR1B | = (1 << CS12) | (1 << CS10);
Aktivera timern jämför avbrott
TIMSK1 | = (1 << OCIE1A);
SEI (); //allow avbrott
Serial.BEGIN(9600);
pinMode (leftOn, produktionen);
pinMode (rightOn, produktionen);
pinMode (leftReverse, produktionen);
pinMode (rightReverse, produktionen);
Se till att strömmen är avstängd
digitalWrite (leftOn, låg);
digitalWrite (rightOn, låg);
digitalWrite (leftReverse, låg);
digitalWrite (rightReverse, låg);
stötfångare sensor stift
pinMode (18, ingång);
pinMode (19, ingång);
Ange avståndet sensor utgångsstift
pinMode (FrontLeftSnd, OUTPUT); stift 30
pinMode (FrontCenterSnd, OUTPUT); PIN 32
pinMode (FrontRightSnd, OUTPUT); PIN 34
pinMode (Side1LeftSnd, OUTPUT); PIN 36
pinMode (Side1CenterSnd, OUTPUT); PIN 38
pinMode (Side1RightSnd, OUTPUT); stift 40
pinMode (BackLeftSnd, OUTPUT); stift 42
pinMode (BackCenterSnd, OUTPUT); PIN 44
pinMode (BackRightSnd, OUTPUT); PIN 46
pinMode (Side2LeftSnd, OUTPUT); PIN 49
pinMode (Side2CenterSnd, OUTPUT); PIN 51
pinMode (Side2RightSnd, OUTPUT); PIN 53
Ange avståndet sensor input pins
pinMode (FrontLeftRcv, indata); stift 31
pinMode (FrontCenterRcv, indata); PIN 33
pinMode (FrontRightRcv, indata); PIN 35
pinMode (Side1LeftRcv, indata); stift 37
pinMode (Side1CenterRcv, indata); PIN-kod 39
pinMode (Side1RightRcv, indata); PIN 41
pinMode (BackLeftRcv, indata); stift 43
pinMode (BackCenterRcv, indata); PIN 45
pinMode (BackRightRcv, indata); PIN 47
pinMode (Side2LeftRcv, indata); PIN 48
pinMode (Side2CenterRcv, indata); PIN 50
pinMode (Side2RightRcv, indata); PIN 52
Och vänta en stund
Delay(3000);
}
void loop() {
lookAllAround();
moveRobot();
Delay(amountToMove);
slowstop();
Delay(1500);
}
ISR(TIMER1_COMPA_vect) {
Avbryta på freq 1 kHz att mäta reed switch / / genererar puls våg av frekvens 8kHz/2 = 4 kHz (tar två cykler för full wave-växla hög sedan växla låg)
om (lefthit == 0 & & righthit == 0 & & fronthit == 0 & & backhit == 0) {
IF(digitalRead(18) == hög) {
hardstop();
Serial.println(goingbackward);
Serial.println(goingforward);
Serial.println(goingleft);
Serial.println(goingright);
Serial.println ("FUCK YEAH!");
IF(goingright == 1) {
righthit = 1;
goingright = 0;
}
IF(goingleft == 1) {
lefthit = 1;
goingleft = 0;
}
IF(goingbackward == 1) {
backhit = 1;
goingbackward = 0;
}
IF(goingforward == 1) {
fronthit = 1;
goingforward = 0;
}
}
}
om (lefthit == 0 & & righthit == 0 & & fronthit == 0 & & backhit == 0) {
IF(digitalRead(19) == hög) {
hardstop();
Serial.println ("FUCK NO!");
Serial.println(goingbackward);
Serial.println(goingforward);
Serial.println(goingleft);
Serial.println(goingright);
IF(goingbackward == 1) {
backhit = 1;
goingbackward = 0;
}
IF(goingforward == 1) {
fronthit = 1;
goingforward = 0;
}
IF(goingright == 1) {
righthit = 1;
goingright = 0;
}
IF(goingleft == 1) {
lefthit = 1;
goingleft = 0;
}
}
}
}
void moveRobot() {
först se om hit--om hit medan du flyttar i någon av riktningarna - auto-pick åt andra hållet
--annars plocka slumpmässigt
IF(backhit == 1) {
amountToMove = 1000;
backhit = 0;
fronthit = 0;
lefthit = 0;
righthit = 0;
plockade = 0;
}
annat if(fronthit == 1) {
amountToMove = 1000;
backhit = 0;
fronthit = 0;
lefthit = 0;
righthit = 0; plockade = 1;
}
annat if(lefthit == 1) {
amountToMove = 500.
backhit = 0;
fronthit = 0;
lefthit = 0;
righthit = 0;
plockade = 2;
}
annat if(righthit == 1) {
amountToMove = 500.
backhit = 0;
fronthit = 0;
lefthit = 0;
righthit = 0;
plockade = 3;
}
annat {
plockade = random(3);
Serial.println("WTF!?");
amountToMove = 1000;
}
Switch(Picked) {
fall 0:
goingforward = 1;
goingbackward = 0;
goingright = 0;
goingleft = 0;
forwards();
Serial.println ("gå framlänges");
bryta;
fall 1:
goingforward = 0;
goingbackward = 1;
goingright = 0;
goingleft = 0;
Backwards();
Serial.println ("gå tillbaka");
bryta;
fall 2:
goingforward = 0;
goingbackward = 0;
goingright = 1;
goingleft = 0;
Right();
Serial.println ("go rätt");
bryta;
fall 3:
goingforward = 0;
goingbackward = 0;
goingright = 0;
goingleft = 1;
Left();
Serial.println ("gå kvar");
bryta;
}
Delay(1); dröjsmål i mellan läser för stabilitet
}
void forwards() {
Aktivera den omvända contactoren
digitalWrite (leftReverse, hög);
Delay(50);
digitalWrite (rightReverse, hög);
Delay(100);
Aktivera solenoider
digitalWrite (leftOn, hög);
digitalWrite (rightOn, hög);
ta ett andetag
Delay(500);
engagera spjäll
analogWrite (rightThrottle, gospeed);
analogWrite (leftThrottle, gospeed);
}
void backwards() {
Aktivera solenoider
digitalWrite (leftOn, hög);
digitalWrite (rightOn, hög);
ta ett andetag
Delay(500);
engagera spjäll
analogWrite (rightThrottle, gospeed);
analogWrite (leftThrottle, gospeed);
}
void right() {
IF(dontgo == 0) {
Aktivera solenoider
digitalWrite (leftOn, hög);
digitalWrite (rightOn, hög);
Aktivera den omvända contactoren
digitalWrite (rightReverse, hög);
ta ett andetag
Delay(500);
engagera spjäll
analogWrite (rightThrottle, gospeed);
analogWrite (leftThrottle, gospeed);
}
återställa variabeln
dontgo = 0;
}
void left() {
IF(dontgo == 0) {
Aktivera solenoider
digitalWrite (leftOn, hög);
digitalWrite (rightOn, hög);
Aktivera den omvända contactoren
digitalWrite (leftReverse, hög);
ta ett andetag
Delay(500);
engagera spjäll
analogWrite (rightThrottle, gospeed);
analogWrite (leftThrottle, gospeed);
}
återställa variabeln
dontgo = 0;
}
void slowstop()
{
för (int fadeValue = gospeed; fadeValue > = 0; fadeValue-=5) {
anger värdet (varierar från 0 till 255):
analogWrite (rightThrottle, fadeValue);
analogWrite (leftThrottle, fadeValue);
vänta 30 millisekunder att se ljusreglering effekten
Delay(500);
}
digitalWrite (leftOn, låg);
digitalWrite (rightOn, låg);
digitalWrite (leftReverse, låg);
digitalWrite (rightReverse, låg);
int goingforward = 0;
int goingbackward = 0;
int goingright = 0;
int goingleft = 0;
Delay(2000);
lookAllAround();
Delay(1000);
}
void hardstop()
{
för (int fadeValue = gospeed; fadeValue > = 0; fadeValue-=5) {
anger värdet (varierar från 0 till 255):
analogWrite (rightThrottle, fadeValue);
analogWrite (leftThrottle, fadeValue);
vänta 30 millisekunder att se ljusreglering effekten
altDelay(50);
}
digitalWrite (leftOn, låg);
digitalWrite (rightOn, låg);
digitalWrite (leftReverse, låg);
digitalWrite (rightReverse, låg);
}
void altDelay(int x) {
för (unsigned int jag = 0; jag < = x; i ++)
{
delayMicroseconds(1000);
}
}
void lookAllAround() {
lång varaktighet, tum, cm;
för (int thisPin = 0; thisPin < 1; thisPin ++) {
digitalWrite (SensorOutputs [thisPin], låg);
delayMicroseconds(2);
digitalWrite (SensorOutputs [thisPin], hög);
delayMicroseconds(12);
digitalWrite (SensorOutputs [thisPin], låg);
längd = pulseIn (SensorInputs [thisPin], hög);
digitalWrite (SensorOutputs [thisPin], låg);
konvertera tiden till ett avstånd
tum = microsecondsToInches(duration);
Serial.Print(SensorOutputs[thisPin]);
Serial.Print(":");
Serial.Print(inches);
Serial.println ("in");
//check och kontrollera igen
om (inches > 10 & & inches < 25) {
realCloseLike = 0;
för (int checkagain = 0; checkagain < 3; checkagain ++) {
Delay(100);
digitalWrite (SensorOutputs [thisPin], låg);
delayMicroseconds(2);
digitalWrite (SensorOutputs [thisPin], hög);
delayMicroseconds(12);
digitalWrite (SensorOutputs [thisPin], låg);
//
längd = pulseIn (SensorInputs [thisPin], hög);
tum = microsecondsToInches(duration);
digitalWrite (SensorOutputs [thisPin], låg);
//
Delay(100);
//
om (inches > 10 & & inches < 25) {
//
Serial.Print(SensorOutputs[thisPin]);
Serial.Print(":");
Serial.Print(inches);
Serial.println ("in");
//
realCloseLike = realCloseLike + 1.
//
om (realCloseLike > 2) {
dontgo = 1;
// }
// }
// }
// }
Tar ca 1/2 sekund för att kontrollera alla sensorerna @ 50uS
Delay(100);
}
}
lång microsecondsToInches(long microseconds)
{
Enligt Parallaxs datablad för PING))), det finns
73.746 mikrosekunder per tum (dvs. ljud resor på 1130 fot per
det andra). Detta ger vägsträcka som ping, utgående
och tillbaka, så vi delar med 2 att få distansera av hindret.
Se: < en href = "http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf" >< en href = "http://www.parallax.com/dl/docs/prod/acc/28015-PI... < / a" > http://www.parallax.com/dl/docs/prod/acc/28015-PI...</a>>
återvända mikrosekunder / 74 / 2;
}
Motorisk kontroll test kodexempel:
/*
Denna exempelkod är offentlig.
*/
upprätta spjäll pins
int leftThrottle = 3; LED är ansluten till digital pin 9
int rightThrottle = 5; LED är ansluten till digital pin 9
upprätta magnetventil pins
int leftOn = 7. LED är ansluten till digital pin 9
int rightOn = 8; LED är ansluten till digital pin 9
upprätta contactor pins
int leftReverse = 9;
int rightReverse = 10;
Körhastighet skickas till gasen
int gospeed = 82.
int nothingHappening = 0;
int realCloseLike = 0;
int goingforward = 0;
int goingbackward = 0;
int goingright = 0;
int goingleft = 0;
int backhit = 0;
int fronthit = 0;
int righthit = 0;
int lefthit = 0;
int amountToMove = 1000;
int timeToWait = 30000;
int plockade;
void setup() {
(CLI); //stop avbrott
TCCR1A = 0; / / Ställ in hela TCCR1A register till 0
TCCR1B = 0; / / samma för TCCR1B
TCNT1 = 0; //initialize värde till 0
Set jämför match registrera för 1hz steg
OCR1A = 512; / / = (16 * 10 ^ 6) / (1 * 1024) - 1 (måste vara < 65536)
Aktivera CTC läge
TCCR1B | = (1 << WGM12);
Anger CS10 och CS12 bitar för 1024 prescaler
TCCR1B | = (1 << CS12) | (1 << CS10);
Aktivera timern jämför avbrott
TIMSK1 | = (1 << OCIE1A);
SEI (); //allow avbrott
Serial.BEGIN(9600);
pinMode (leftOn, produktionen);
pinMode (rightOn, produktionen);
pinMode (leftReverse, produktionen);
pinMode (rightReverse, produktionen);
Se till att strömmen är avstängd
digitalWrite (leftOn, låg);
digitalWrite (rightOn, låg);
digitalWrite (leftReverse, låg);
digitalWrite (rightReverse, låg);
stötfångare sensor stift
pinMode (18, ingång);
pinMode (19, ingång);
Och vänta en stund
Delay(3000);
}
void loop() {
Left();
Delay(amountToMove);
slowstop();
Delay(timeToWait);
Backwards();
Delay(amountToMove);
slowstop();
Delay(timeToWait);
forwards();
Delay(amountToMove);
slowstop();
Delay(timeToWait);
Right();
Delay(amountToMove);
slowstop();
Delay(timeToWait);
///
Right();
Delay(amountToMove);
slowstop();
Delay(timeToWait);
forwards();
Delay(amountToMove);
slowstop();
Delay(timeToWait);
Backwards();
Delay(amountToMove);
slowstop();
Delay(timeToWait);
Left();
Delay(amountToMove);
slowstop();
Delay(timeToWait);
///
forwards();
Delay(amountToMove);
slowstop();
Delay(timeToWait);
Backwards();
Delay(amountToMove);
slowstop();
Delay(timeToWait);
forwards();
Delay(amountToMove);
slowstop();
Delay(timeToWait);
Backwards();
Delay(amountToMove);
slowstop();
Delay(timeToWait);
}
ISR(TIMER1_COMPA_vect) {
Avbryta på freq 1 kHz att mäta reed switch / / genererar puls våg av frekvens 8kHz/2 = 4 kHz (tar två cykler för full wave-växla hög sedan växla låg)
om (lefthit == 0 & & righthit == 0 & & fronthit == 0 & & backhit == 0) {
IF(digitalRead(18) == hög) {
hardstop();
Serial.println(goingbackward);
Serial.println(goingforward);
Serial.println(goingleft);
Serial.println(goingright);
Serial.println ("FUCK YEAH!");
IF(goingright == 1) {
righthit = 1;
goingright = 0;
}
IF(goingleft == 1) {
lefthit = 1;
goingleft = 0;
}
IF(goingbackward == 1) {
backhit = 1;
goingbackward = 0;
}
IF(goingforward == 1) {
fronthit = 1;
goingforward = 0;
}
}
}
om (lefthit == 0 & & righthit == 0 & & fronthit == 0 & & backhit == 0) {
IF(digitalRead(19) == hög) {
hardstop();
Serial.println(goingbackward);
Serial.println(goingforward);
Serial.println(goingleft);
Serial.println(goingright);
Serial.println ("FUCK NO!");
IF(goingbackward == 1) {
backhit = 1;
goingbackward = 0;
}
IF(goingforward == 1) {
fronthit = 1;
goingforward = 0;
}
IF(goingright == 1) {
righthit = 1;
goingright = 0;
}
IF(goingleft == 1) {
lefthit = 1;
goingleft = 0;
}
}
}
}
void moveRobot() {
först se om hit--om hit medan du flyttar i någon av riktningarna - auto-pick åt andra hållet
--annars plocka slumpmässigt
IF(backhit == 1) {
amountToMove = 1000;
backhit = 0;
fronthit = 0;
lefthit = 0;
righthit = 0;
plockade = 0;
}
annat if(fronthit == 1) {
amountToMove = 1000;
backhit = 0;
fronthit = 0;
lefthit = 0;
righthit = 0; plockade = 1;
}
annat if(lefthit == 1) {
amountToMove = 500.
backhit = 0;
fronthit = 0;
lefthit = 0;
righthit = 0;
plockade = 2;
}
annat if(righthit == 1) {
amountToMove = 500.
backhit = 0;
fronthit = 0;
lefthit = 0;
righthit = 0;
plockade = 3;
}
annat {
plockade = random(3);
Serial.println("WTF!?");
amountToMove = 1000;
}
Switch(Picked) {
fall 0:
goingforward = 1;
goingbackward = 0;
goingright = 0;
goingleft = 0;
forwards();
Serial.println ("gå framlänges");
bryta;
fall 1:
goingforward = 0;
goingbackward = 1;
goingright = 0;
goingleft = 0;
Backwards();
Serial.println ("gå tillbaka");
bryta;
fall 2:
goingforward = 0;
goingbackward = 0;
goingright = 1;
goingleft = 0;
Right();
Serial.println ("go rätt");
bryta;
fall 3:
goingforward = 0;
goingbackward = 0;
goingright = 0;
goingleft = 1;
Left();
Serial.println ("gå kvar");
bryta;
}
Delay(1); dröjsmål i mellan läser för stabilitet
}
void forwards() {
Aktivera den omvända contactoren
digitalWrite (leftReverse, hög);
Delay(50);
digitalWrite (rightReverse, hög);
Delay(100);
Aktivera solenoider
digitalWrite (leftOn, hög);
digitalWrite (rightOn, hög);
ta ett andetag
Delay(500);
engagera spjäll
analogWrite (rightThrottle, gospeed);
analogWrite (leftThrottle, gospeed);
}
void backwards() {
Aktivera solenoider
digitalWrite (leftOn, hög);
digitalWrite (rightOn, hög);
ta ett andetag
Delay(500);
engagera spjäll
analogWrite (rightThrottle, gospeed);
analogWrite (leftThrottle, gospeed);
}
void right() {
Aktivera solenoider
digitalWrite (leftOn, hög);
digitalWrite (rightOn, hög);
Aktivera den omvända contactoren
digitalWrite (rightReverse, hög);
ta ett andetag
Delay(500);
engagera spjäll
analogWrite (rightThrottle, gospeed);
analogWrite (leftThrottle, gospeed);
}
void left() {
Aktivera solenoider
digitalWrite (leftOn, hög);
digitalWrite (rightOn, hög);
Aktivera den omvända contactoren
digitalWrite (leftReverse, hög);
ta ett andetag
Delay(500);
engagera spjäll
analogWrite (rightThrottle, gospeed);
analogWrite (leftThrottle, gospeed);
}
void slowstop()
{
för (int fadeValue = gospeed; fadeValue > = 0; fadeValue-=5) {
anger värdet (varierar från 0 till 255):
analogWrite (rightThrottle, fadeValue);
analogWrite (leftThrottle, fadeValue);
vänta 30 millisekunder att se ljusreglering effekten
Delay(500);
}
digitalWrite (leftOn, låg);
digitalWrite (rightOn, låg);
digitalWrite (leftReverse, låg);
digitalWrite (rightReverse, låg);
int goingforward = 0;
int goingbackward = 0;
int goingright = 0;
int goingleft = 0;
}
void hardstop()
{
för (int fadeValue = gospeed; fadeValue > = 0; fadeValue-=5) {
anger värdet (varierar från 0 till 255):
analogWrite (rightThrottle, fadeValue);
analogWrite (leftThrottle, fadeValue);
vänta 30 millisekunder att se ljusreglering effekten
altDelay(50);
}
digitalWrite (leftOn, låg);
digitalWrite (rightOn, låg);
digitalWrite (leftReverse, låg);
digitalWrite (rightReverse, låg);
}
void altDelay(int x) {
för (unsigned int jag = 0; jag < = x; i ++)
{
delayMicroseconds(1000);
}
}