Pixybot färg spårning robotar (9 / 10 steg)

Steg 9: kod

Du behöver TOPPLUVA biblioteket från Följ länken:

TOPPLUVA bibliotek

Försök också och uppdatera till den senaste firmware på TOPPLUVA och dess kontrollerande programvara PixyMon

Obs:

När lastning program är det bäst att koppla ur TOPPLUVA från ISP-anslutningen sedan återkoppla den en gång gjort.

ArchReactor Pixybot < br > / / Skrivet av: Apollo W. virke
2015
//
Koden översynen mark VI
//
Denna kod är en intigration av TOPPLUVA Visionsystem till en mobil plattform att höja awerness av maker utrymme
vet som Arch reaktorn.
Delar av koden inkluderar efter spårade objekt, IR sensor objekt upptäcka, A PID kontrollerar kretsar,
Ett svagt batteri varning/cuttoff. och pausar enheten servon så kan du träna i TOPPLUVA.
//
Delar av denna kod kommer från Adafruit industrier TOPPLUVA Pet kod.
Delar av denna kod kommer från TOPPLUVA CMUcam5 pantilt exempelkod.
//

< p > #include < SPI.h >< br > #include < Pixy.h >
#include < Servo.h >< /p >
#define X_CENTER 160L
#define Y_CENTER 100L
#define RCS_MIN_POS 0L
#define RCS_MAX_POS 1000L
#define RCS_CENTER_POS ((RCS_MAX_POS-RCS_MIN_POS)/2)

antal analoga prover att ta per läsning
#define NUM_SAMPLES 10

konstanter ändras inte. De används här till
Ange pin-koder:
int summa = 0; summan av prover
unsigned char sample_count = 0; aktuella antalet stickprov
CONST int buttonPin = 2; numrera av tryckknapp PIN-koden
CONST int ledPin = 13. pin-kod för LED stift
int ledgreen = 5; pin-kod för LED stift
int ledred = 7. pin-kod för LED stift
variabler som ändras:
int buttonState = 0; variabel för att läsa tryckknapp status
Servo leftServo; Definiera servon
Servo rightServo;
Servo gripperServo;
int analogInput = A0;
unsigned int raw;
dubbel vcc = 0;
dubbel spänning; beräknade spänningen
CONST int irSenseleft = A1; Anslut sensor till analoga stift A0
int distanceleft = 0;
CONST int irSenseright = A2; Anslut sensor till analoga stift A0
int distanceright = 0;
klass ServoLoop

{
offentlig:
ServoLoop (int32_t pgain, int32_t dgain);

void uppdatering (int32_t fel);

int32_t m_pos;
int32_t m_prevError;
int32_t m_pgain;
int32_t m_dgain;
};

ServoLoop panLoop (200, 200);
ServoLoop tiltLoop (150, 200);

ServoLoop::ServoLoop (int32_t pgain, int32_t dgain)
{
m_pos = RCS_CENTER_POS;
m_pgain = pgain;
m_dgain = dgain;
m_prevError = 0x80000000L;
}

void ServoLoop::update (int32_t fel)
{
långa int vel;
char buf [32];
om (m_prevError! = 0x80000000)
{
Vel = (fel * m_pgain + (fel - m_prevError) * m_dgain) >> 10;
sprintf (buf, "%ld\n", vel);
Serial.Print(BUF);
m_pos += vel;
om (m_pos > RCS_MAX_POS)
m_pos = RCS_MAX_POS;
annars om (m_pos > 3.
om (storlek > = 500);
Grip();
om (millis() - håll > random(3000, 7000))
Drop();
}
annars om (millis() - lastBlockTime > 3000)
{
leftServo.writeMicroseconds(1510);
rightServo.writeMicroseconds(1510);
ScanForBlocks();
}
om (millis ()-timer > 2999) / / om minst 3000mS har gått
{
timer=Millis(); nollställa timern
readVcc();
Voltage();
}
om (millis ()-timerA > 49) //Wait 50 ms mellan varje läsa för IR
Enligt datablad tid mellan varje Läs
är-38ms +/-10 MS. Väntar på 50 ms försäkrar varje
Läs är från ett annat prov
{
timerA=millis(); nollställa timern
PauseButton();
irRead();
}
om (spänning > = 6) {
digitalWrite (ledgreen, hög);
}
annars om ((spänning > = 5) & & (spänning < 6))
{
digitalWrite (ledgreen, låg);
digitalWrite (ledred, hög);
}
annars om (spänning < 5)
{
leftServo.writeMicroseconds(1510); Håll motorer på grund av låg poer statligt
rightServo.writeMicroseconds(1510);
digitalWrite (ledgreen, låg);
digitalWrite (ledred, hög); LEDDE till att varna för lågt batteri
fördröjning (500).
digitalWrite (ledred, låg);
fördröjning (500).
}

}

int oldX, oldY, oldSignature;

//---------------------------------------
Spåra block via TOPPLUVA pan/tilt mech
(bygger delvis på TOPPLUVA CMUcam5 pantilt exempel)
//---------------------------------------
int TrackBlock (int blockCount)
{
int trackedBlock = 0;
långa maxSize = 0;
uint32_t håll = 0;

Serial.Print ("block =");
Serial.println(blockCount);

för (int jag = 0; jag < blockCount; i ++)
{
om ((oldSignature == 0) || (pixY.Blocks[i].Signature == oldSignature))
{
lång newSize = pixy.blocks[i].height * pixy.blocks[i].width;
om (newSize > maxSize)
{
trackedBlock = i.
maxSize = newSize;
}
}
}

int32_t panError = X_CENTER - pixy.blocks[trackedBlock].x;
int32_t tiltError = pixy.blocks[trackedBlock].y - Y_CENTER;

panLoop.update(panError);
tiltLoop.update(tiltError);

pixy.setServos (panLoop.m_pos, tiltLoop.m_pos);

oldX = pixy.blocks[trackedBlock].x;
oldY = pixy.blocks[trackedBlock].y;
oldSignature = pixy.blocks[trackedBlock].signature;
återvända trackedBlock;
}

void FollowBlock(int trackedBlock)
{
int32_t followError = pixy.blocks[0] .x-X_CENTER; Hur långt off-center är vi ser nu?

Storleken är området av objektet.
Vi hålla en löpande genomsnittliga senaste 8.
storlek += pixy.blocks[trackedBlock].width * pixy.blocks[trackedBlock].height;
storlek-= storlek >> 3.

Fart framåt minskar när vi närmar oss objektet (storleken är större)
int forwardSpeed = begränsa (400 - (storlek/400), -100, 400);

Styrning differential är proportionell mot fel tider fart framåt
int32_t differential = (followError + (followError * forwardSpeed)) >> 6;

Justera vänster och höger hastigheterna av manöverorganet differential.
int leftSpeed = begränsa (forwardSpeed + differential,-400, 400);
int rightSpeed = begränsa (forwardSpeed - Differens,-400, 400);

leftSpeed = map(leftSpeed,-400,400,1650,1350); Karta till servo produktionsvärden
rightSpeed = map(rightSpeed,-400,400,1350,1650); Karta till servo produktionsvärden

Uppdatera servon
leftServo.writeMicroseconds(leftSpeed);
rightServo.writeMicroseconds(rightSpeed);
}

int scanIncrement = (RCS_MAX_POS - RCS_MIN_POS) / 150;
uint32_t lastMove = 0;
//---------------------------------------
Slumpmässig sökning för block
//
Denna kod roterar långsamt i en cirkel
tills ett block detekteras
//---------------------------------------
void ScanForBlocks()
{
om (millis() - lastMove > 10)
{
lastMove = millis();
panLoop.m_pos += scanIncrement;
om ((panLoop.m_pos > = RCS_MAX_POS) || (panLoop.m_pos < = RCS_MIN_POS))
//{
tiltLoop.m_pos =(RCS_MAX_POS * 0.6);
scanIncrement = - scanIncrement;
om (scanIncrement < 0)

leftServo.writeMicroseconds(1460);
rightServo.writeMicroseconds(1460);
fördröjning (20);

pixy.setServos (panLoop.m_pos, tiltLoop.m_pos);
}
}

Ta flera avläsningar, och dem utjämnas till i genomsnitt minska felaktiga avläsningar
void irRead()
{
int averagingleft = 0; Håller värde till genomsnittliga avläsningar
int averagingright = 0; Håller värde till genomsnittliga avläsningar

Får ett urval av 5 avläsningar från sensorn
för (int jag = 0; jag < 3; i ++)
{
distanceleft = analogRead(irSenseleft);
averagingleft = averagingleft + distanceleft;
distanceright = analogRead(irSenseright);
averagingright = averagingright + distanceright;
}
distanceleft = averagingleft / 5; I genomsnitt ut avläsningar
Return(distanceleft); Returvärdet
Serial.println (distanceleft, DEC);
distanceright = averagingright / 5; I genomsnitt ut avläsningar
Return(distanceright); Returvärdet
Serial.println (distanceright, DEC);
om (distanceleft > 85)
{
leftServo.writeMicroseconds(1510); allstop
rightServo.writeMicroseconds(1510);
Delay(200);
leftServo.writeMicroseconds(1660); säkerhetskopiering
rightServo.writeMicroseconds(1460);
Delay(500);
leftServo.writeMicroseconds(1460); Spin
rightServo.writeMicroseconds(1460);
Delay(300);

}
annars om (distanceright > 85)
{
allstop
leftServo.writeMicroseconds(1510);
rightServo.writeMicroseconds(1510);
fördröjning (200);
}
}

void Voltage()
{
VCC = readVcc () / 1000.0;
rå = analogRead(analogInput);
spänning = ((raw / 1023.0) * vcc) * 2;
Serial.Print ("batterispänning =");
Serial.println (spänning, DEC);
Serial.Print ("VCC spänning =");
Serial.println (vcc, DEC);
}

lång readVcc() {
långa resultatet;
Läs 1.1v referens mot AVcc
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
Delay(2); Vänta på Vref sedimentera
ADCSRA | = _BV(ADSC); Konvertera
samtidigt (bit_is_set(ADCSRA,ADSC));
resultat = ADCL;
resultatet | = ADCH << 8;
resultat = 1106400L / leda; Back-beräkna AVcc i mV
returnera resultat;
}

void Pausebutton()
{
sample_count = 0;
summa = 0;
buttonState = digitalRead(buttonPin);

Kontrollera om tryckknappen trycks.
om det är, är buttonState hög:
om (buttonState == hög) {
Aktivera LED:
leftServo.writeMicroseconds(1510);
rightServo.writeMicroseconds(1510);
Delay(18000);
}
}

Se Steg
Relaterade Ämnen

Raspberry Pi bollen spårning

(Obs: detta är en avancerad handledning, det är inte avsett för linux nybörjare.)I denna tutorial kommer jag visa hur man spåra pingis bollar med OpenCV på Raspberry Pi. Det kan användas för att spåra alla cirkulär objekt så länge det kan upptäckas v...

DIY autonoma linje spårning med hinder undvika Robot (Rover)

Varning: gör din dator ljusstyrka låg, eftersom detta projekt avger en hög nivå av AWESOMENESS som kan skada dina ögon :D 3:)Projektet deltog i RoboCup 2015 Egypten lokal tävling och vann "Bästa Design Award" med mitt lag Abdelrahman Alaa, Ahmad...

En ram för att göra prisvärda & eleganta modulära styrsystem (USB till MIDI, gömde sig, eller seriella)

***JAG HAR SKAPAT EN NY INSTRUCTABLE FÖR DIY STYRENHETER:*************************************************************************************************************************************************************************************************...

Linkit en sensor handledning

Instructable tillkännagav nyligen en linkit en ge bort där de tillhandahöll 250 linkit en styrelser. Jag var en av de 250 folk som fått dessa styrelser. Så jag skulle vilja tack mediatek och penolopy Bulnick och hela instructable team för att ge mig...

Sprida kärlek med robotar

en byggsats för kärlek...Idén om en "kärlek Robot" ursprungligen planterades i mitt huvud av min dotter Moraḯtika arbete "En Robot gjord av kärlek och med kärlek", som visas i den tredje bilden nedan. Så jag började göra små robotar so...

Micro papper robotar (cyborg krabba)

Dess en hexapod robot, dess bara några millimeter hög och dess gjord nästan helt från papper!Var och en av de mekaniserade insekt ben är fullt ledade och har förmågan att flytta med hastigheter på upp till 240 steg per minut.En gång byggde denna robo...

Byggnaden små robotar: Att göra en kubik tums mikro-Sumo robotar och mindre

här är några detaljer på att bygga små robotar och kretsar. Detta instructable kommer också täcka några grundläggande tips och tekniker som är användbara i att bygga robotar i alla storlekar.För mig är en av de stora utmaningarna i elektronik att se...

Första person WiFi körning av Roombas och andra IR RC fordon

Sticka en smartphone en avlägsen kontrollerade fordon och att ha det ström kamera video över WiFi kan du ha roligt köra fordonet med dess fjärrkontroll medan du tittar på bilder från det på en annan enhet och med hjälp av fordonets egen fjärrkontroll...

Skapandet av en klistermärke Critter och transmogrification av sin själ till en multi-purpose digital fil (aka skärning, scanning och Live-spårning i en vektor fil) - Jag gjorde det på TechShop San Jose

jag upptäckte nyss att jag inte kan dra tillräckligt väl för att tillfredsställa mina egna förväntningar, men jag har alltid varit riktigt bra med mina händer. Jag jobbar på ett FedEx-kontor, och märkte att när vi ser ett paket, systemet skrivs bara...

Instruktion för att göra robotar kostym

Design av dräkten måste visuellt både ser bra och baserat på de mest perfekta, den senaste möjliga framtida robotics tekniken. Det är därför kostym har att företräda roboten som anläggning och skyddande struktur måste vara exoskelett och mekanisk kra...

Swarmscapers: Autonoma mobila 3D-utskrifter robotar

Swarmscapers är en 2 månad lång forskningsprojekt bedrivs i Kreativ arkitektur maskiner studion, undervisas av Jason Kelly Johnson och Michael Shiloh på Kalifornien College of Arts i Digital Craft Lab. Det är ett samarbete mellan Clayton Muhleman, Al...

Minibuilders - hur man 3d utskrift stora strukturer med små robotar

Det har alltid funnits en nära relation mellan arkitektur och teknik. Dock nyligen arkitekturen har stagnerat och byggbranschen har varit långsamma med att anta teknik som redan är väl etablerad i andra fält. Samtidigt som vi designar digitalt bygger...

Hur konvertera 3D-skrivare eller CNC router i skärning eller gravyr maskin?

Uthållighet är en tillväxtorienterad Ryss-Amerikan teknisk start-up, specialiserat på utveckling och försäljning av tekniska produkter, främst lasrar, robotar och drönare.Endurance erbjudanden: diod lasrar L-Cheapo (2,1 W, 3,5 W) för 3D-skrivare och...

Skär industriella filt med en vattenskärning

En laserskärare kommer att göra ett bra jobb när skära filt men det finns betydande nackdelar den tekniken. Syntetisk filt kommer att bilda en liten smält pärla längs den skurna kanten, och ull kände singesna och luktar som bränt hår. Det finns också...

Förstärkt verklighet med hjälp av Unity3D och Vuforia – utökat spårning

Mer Augmented Reality finns tutorials här:1.2.3.4.5.6.7.8.9.10.11.12.Steg 1: Hämta allt nedan och följ instruktionerna i videonHämta # Unity3D (Hämta och installera den, om du inte har det redan) (*.exe-fil)Unity3D finns också att ladda ner från härH...

Nybörjarguide till Maya: robotar

Autodesk Maya är ett bra verktyg för att skapa komplexa modeller. Om du vet vad du gör, kan du ganska mycket design något med Maya. I detta instructable, jag kommer att vara din guide till enkla polygon modellering i Maya. Även med grundläggande verk...

Skapa en Åttahörning från en kvadrat

Rita en fyrkant, som används för att rita denna octagon.Steg 1: Dela i thirdsDela längderna i tredjedelar. Om du vill ha en regelbunden oktagon, måste längder dock runt förhållandet 7:10:7.Steg 2: Uppdelningen i 9 rutor Dra längs markeringarna skapa...

433 MHz måttband antenn-passar UHF sändare spårning!

Detta Instructable avser design & utvärdering av en enkel måttband baserat 433 MHz 3 element Yagi antenn. En effektiv mottagare gjordes genom att "övertala" en ~ US$ 4 Dorji 433 MHz be (amplitud Shift Keying) data modul till analoga signalen...

En CharliePlexed RGB LED Tärning

detta Instructable kommer att visa hur man gör en färgstark tärning med hjälp av charlieplexing med RGB-lysdioder.Projektet använder 7 RGB lysdioder ordnade i form av tärningarna. Varje RGB LED har tre separata lysdioder inuti så som gör totalt 21 ly...