Grondbeginselen van het omzetten van uw externe controle voertuig in een autonoom systeem (Drone) met behulp van een Arduino (5 / 7 stap)

Stap 5: De Code deel 2


Zo ervan uitgaande dat uw Test-wen goed kunnen we beginnen met het toevoegen van sensoren op de ambachtelijke activiteit, dit is waar het systeem wordt nuttig.

U kunt welke sensor u wilt en zoveel als je wilt, zolang ze kunnen interface met de arduino die u gebruikt.

Om aan te tonen van dit idee, heb ik geschreven wat code die een vertegenwoordiger van de lezing van afstand van een scherpe analoge Infra-rood-sensor die is gemonteerd op de ene kant van de helikopter neemt en als de lezing houdt in dat de helikopter een obstakel nadert vervolgens het zal afbuigen af naar de tegenovergestelde zijde. Anders blijft de controle volledig op onze handen.

Ik heb de code van de gasklep in ondanks het feit dat het niet wordt gebruikt in het geval dat u gebruikmaakt van een 3de signaal lijn; het bespaart u tijd toe te voegen de code terug in :) ben ik mooi niet!

Hier is de gewijzigde Code en vergeet niet om de opmerkingen te lezen om er duidelijk over wat de code doet:

#include < RCArduinoFastLib.h >

//
Kapitein Dyson's Mod naar the Origional Test structuur van RCArduino de voorbeeldcode
voor de bibliotheek van de "RCArduinoFastLib"
Deze code leest een afstandssensor alvorens te beslissen of weg of niet.
//

MultiChannels
rcarduino.blogspot.com
Een eenvoudige benadering voor het lezen van drie kanalen van de RC met behulp van de pin wijzigen interrupts
Zie Verwante posten-
http://rcarduino.blogspot.co.uk/2012/01/How-to-read-RC-Receiver-with.html
http://rcarduino.blogspot.co.uk/2012/03/need-more-interrupts-to-read-more.html
http://rcarduino.blogspot.co.uk/2012/01/can-i-Control-more-than-x-servos-with.html
rcarduino.blogspot.com

de bibliotheek pinchangeint - Zie de koppelingen in het gedeelte ' Verwante onderwerpen ' hierboven voor meer informatie
#include < PinChangeInt.h >

Toewijzen van uw kanaal in pinnen
#define THROTTLE_IN_PIN 5
#define STEERING_IN_PIN 6
#define AUX_IN_PIN 7

Toewijzen van uw kanaal uit pinnen
#define THROTTLE_OUT_PIN 8
#define STEERING_OUT_PIN 9
#define AUX_OUT_PIN 10

Toewijzen van servo indexen
#define SERVO_THROTTLE 0
#define SERVO_STEERING 1
#define 2
#define SERVO_FRAME_SPACE 3

Deze vlaggen bits zijn ingesteld in de bUpdateFlagsShared om aan te geven welke kanalen nieuwe signalen
#define THROTTLE_FLAG 1
#define STEERING_FLAG 2
#define AUX_FLAG 4

houdt de vlaggen van de update hierboven omschreven
vluchtige uint8_t bUpdateFlagsShared;

gedeelde variabelen worden bijgewerkt door de ISR en gelezen door de lus.
In lus we nu nemen lokale kopieën zodat de ISR kan blijven eigendom van de
gedeelde ones. Voor toegang tot deze in lus we eerst uitschakelen onderbreekt met noInterrupts
We nemen een kopie te gebruiken in de lus en de turn interrupts terug op zo spoedig mogelijk
Dit zorgt ervoor dat we kunnen altijd nieuwe signalen ontvangen
vluchtige uint16_t unThrottleInShared;
vluchtige uint16_t unSteeringInShared;
vluchtige uint16_t unAuxInShared;

Deze worden gebruikt om vast te leggen van de stijgende rand van een puls in de calcInput-functies
Ze hoeven niet te worden vluchtige zoals ze alleen in de ISR. gebruikt worden Als we wilden
Als u wilt verwijzen naar deze in de loop en de ISR zou dan zij moeten worden verklaard vluchtige
uint16_t unThrottleInStart;
uint16_t unSteeringInStart;
uint16_t unAuxInStart;

uint16_t unLastAuxIn = 0;
uint32_t ulVariance = 0;
uint32_t ulGetNextSampleMillis = 0;
uint16_t unMaxDifference = 0;

Toewijzen van een kegel de sensorgegevens lezen
int sensorPin = A0;

VOID Setup
{
Serial.begin(115200);
Serial.println("multiChannels");

hechten servo objecten, deze zorgt voor de juiste
pulsen voor het besturen van elektronische snelheidsregelaars, servo's of andere apparaten
ontworpen om te communiceren rechtstreeks met RC ontvangers
CRCArduinoFastServos::attach(SERVO_THROTTLE,THROTTLE_OUT_PIN);
CRCArduinoFastServos::attach(SERVO_STEERING,STEERING_OUT_PIN);
CRCArduinoFastServos::attach(SERVO_AUX,AUX_OUT_PIN);

laat een standaardtarief van 50 Hz instellen door de instelling van een ruimte van de frame van 10 * 2000 = 3 Servos + 7 keer 2000
CRCArduinoFastServos::setFrameSpaceA(SERVO_FRAME_SPACE,7*2000);
CRCArduinoFastServos::begin();

met behulp van de PinChangeInt-bibliotheek, hechten de interrupts gebruikt om te lezen van de kanalen
PCintPort::attachInterrupt (THROTTLE_IN_PIN, calcThrottle, verandering);
PCintPort::attachInterrupt (STEERING_IN_PIN, calcSteering, verandering);
PCintPort::attachInterrupt (AUX_IN_PIN, calcAux, verandering);
}

void loop
{
lokale variabelen voor het opslaan van een lokale kopieën van de ingangen van het kanaal maken
deze worden gedeclareerd statische zodat hun waarden tussen aanroepen van lus zal worden bewaard.
statisch uint16_t unThrottleIn;
statisch uint16_t unSteeringIn;
statisch uint16_t unAuxIn;
lokale kopie van update vlaggen
statische uint8_t bUpdateFlags;

controleren van gedeelde update vlaggen om te zien of alle kanalen een nieuw signaal
if(bUpdateFlagsShared)
{
noInterrupts(); uitschakelen onderbreekt snel terwijl we lokale kopieën van de gedeelde variabelen nemen

nemen van een lokale kopie van die kanalen zijn bijgewerkt in het geval dat we nodig hebben om dit te gebruiken in de rest van de lus
bUpdateFlags = bUpdateFlagsShared;

in de huidige code, worden de gedeelde waarden altijd gevuld
dus we hen kunnen kopiëren zonder het testen van de vlaggen
echter in de toekomst kan dit veranderen, dus laat
alleen kopiëren wanneer de vlaggen vertellen ons dat we kunnen.
if(bUpdateFlags & THROTTLE_FLAG)
{
unThrottleIn = unThrottleInShared;
}
if(bUpdateFlags & STEERING_FLAG)
{
unSteeringIn = unSteeringInShared;
}
if(bUpdateFlags & AUX_FLAG)
{
unAuxIn = unAuxInShared;
}

Schakel gedeelde kopie van updated vlaggen zoals we al de updates hebben
We hebben nog een lokale kopie als we nodig hebben om het te gebruiken in bUpdateFlags
bUpdateFlagsShared = 0;

interrupts(); We hebben van de lokale kopieën van de ingangen, dus nu kunnen wij draaien onderbreekt terug op
Zodra er zijn interrupts terug op, kunnen we niet langer gebruiken de gedeelde exemplaren, de interrupt
dienst routines eigen deze en kunnen ze op elk gewenst moment bijwerken. Tijdens de update, de
gedeelde kopieën kunnen ongewenste bevatten. Gelukkig hebben wij onze lokale kopieën om mee te werken :-)
}

doen van elke vorm van verwerking vanaf hier verder
Gebruik alleen de lokale waarden unAuxIn, unThrottleIn en unSteeringIn

Deze Sensor gedetecteerd dat de prescence van een object naar de helecopters rechts
Als het object te sluiten dan de craft links, uit de buurt van het gevaar afleiden zal
U kunt zoveel als lussen in deze code als u met verschillende sensoren
maar doen niet Kopieer deze code precies en verwacht dat het werkt, het allemaal afhankelijk van
de details van uw servo's en de aanwijzingen die u laten reizen wilt
Deze code is specifiek voor mijn lichaamsbouw, wijzigen voor jou :)

Lees de Sensor
int val = analogRead(sensorPin);
plaats een voorwaarde tegen deze lezing
Als (val > 150)
{
handelen op de voorwaarde
unSteeringIn = unSteeringIn + 430;
Toepassing van de nieuwe gewijzigde waarden
if(bUpdateFlags & THROTTLE_FLAG)
{
CRCArduinoFastServos::writeMicroseconds(SERVO_THROTTLE,unThrottleIn);
}

if(bUpdateFlags & STEERING_FLAG)
{
CRCArduinoFastServos::writeMicroseconds(SERVO_STEERING,unSteeringIn);
}

if(bUpdateFlags & AUX_FLAG)
{
CRCArduinoFastServos::writeMicroseconds(SERVO_AUX,unAuxIn);
}
}
Als we hebben geen reden om te veranderen van de servo-posities kunt dan we het signaal via doorgeven
zoals we hebben gedaan in de schets van de test met geen wijzigingen.
anders
{
if(bUpdateFlags & THROTTLE_FLAG)
{
CRCArduinoFastServos::writeMicroseconds(SERVO_THROTTLE,unThrottleIn);
}

if(bUpdateFlags & STEERING_FLAG)
{
CRCArduinoFastServos::writeMicroseconds(SERVO_STEERING,unSteeringIn);
}

if(bUpdateFlags & AUX_FLAG)
{
CRCArduinoFastServos::writeMicroseconds(SERVO_AUX,unAuxIn);
}
}
bUpdateFlags = 0;
}

eenvoudige interrupt service routine
VOID calcThrottle()
{
if(PCintPort::pinState)
{
unThrottleInStart = TCNT1;
}
anders
{
unThrottleInShared = (TCNT1 - unThrottleInStart) >> 1;
bUpdateFlagsShared | = THROTTLE_FLAG;
}
}

VOID calcSteering()
{
if(PCintPort::pinState)
{
unSteeringInStart = TCNT1;
}
anders
{
unSteeringInShared = (TCNT1 - unSteeringInStart) >> 1;

bUpdateFlagsShared | = STEERING_FLAG;
}
}

VOID calcAux()
{
if(PCintPort::pinState)
{
unAuxInStart = TCNT1;
}
anders
{
unAuxInShared = (TCNT1 - unAuxInStart) >> 1;
bUpdateFlagsShared | = AUX_FLAG;  }
}

Nu herinner me dat dit is slechts een eenvoudig voorbeeld, wees zo inventief als je wilt en zoveel sensoren toevoegen als u zoals, enkele ideeën zou een versnellingsmeter en de sensor van een PING voor de langere afstanden, sensing of nog verder gaan en een GPS met een huidige locatie vs. doel locatie vergelijking toevoegen dan krijgen van uw apparaat naar een bepaalde geografische locatie.

Gerelateerde Artikelen

Setup van externe stuurprogramma op Smoothieware Sbase 1.2 Controller met behulp van E1 pinnen!

Setup van externe stuurprogramma op Smoothieware Sbase 1.2 Controller met behulp van E1 pinnen!

Inhoud van dit Instructable:ProloqueHeatsink stuurprogrammaproblemenTer ziele Y bestuurderSetup Smoothieware E1 gebruiken als onze Y-asY stuurprogramma - origineelY bestuurder - met behulp van E01Volledige stuurprogramma pin-out diagramSetup van exte
Grondbeginselen van de Arduino (Duemilanove)

Grondbeginselen van de Arduino (Duemilanove)

In dit instructable ik zal je laten zien hoe uw allereerste programma voor de arduino (Duemilanove) te schrijven.Volg gewoon de stappen en als je naar het einde gaat, je je eerste arduino-programma zal hebt geschreven!Dit is een tutorial voor beginne
De grondbeginselen van de Arduino Esplora

De grondbeginselen van de Arduino Esplora

Oh! Ik zie niet je daar! Je moet willen leren de grondbeginselen van de basisprincipes van grote Esplora bestuur. Nou, kom, kom. Deze tutorial leert u over een paar nette trucs die je kunt doen met uw Esplora.Stap 1: onderdelenHiervoor kunnen instrue
Grondbeginselen van het begin van de Top geheime Bunker Project en grondlagen verwijderen

Grondbeginselen van het begin van de Top geheime Bunker Project en grondlagen verwijderen

ik heb peinzen een tweede huis onder degene die ik net klaar met bouwstijl bunker voor Tornado's en gewoon omdat het leuk zou zijn.Een groot deel van de arbeid gaat om het verplaatsen van het zand en klei onder het huis naar de achtertuin en als u oo
LED knipperen door externe PC met behulp van WIZwiki-W7500 mbed, Platform

LED knipperen door externe PC met behulp van WIZwiki-W7500 mbed, Platform

Introduceer ik een LED knipperen controle van externe PC via netwerk (TCP-protocol).Een TCP-clientprogramma wordt uitgevoerd in de PC en een TCP server draait in een WIZwiki-W7500 mbed platform board. W7500 gegevens naar PC verzendt en ontvangt gegev
Toegang tot extern bureaublad met behulp van TeamViewer

Toegang tot extern bureaublad met behulp van TeamViewer

Having te zwaar tijd delen van bestanden of getting vermoeid van uw project, omdat u niet het en echt nodig helpen? Zou het niet mooi zijn als u alleen toegang uw bestanden op andere computers gemakkelijk tot kunt? Nou, met toegang tot extern bureaub
Leren van de grondbeginselen van Adobe Photoshop

Leren van de grondbeginselen van Adobe Photoshop

Hieronder vindt u enkele eenvoudige instructies te helpen u duik in de wereld van Photoshop. Zodra u comfortabel met de concepten die hier behandeld krijgt, zult u in staat om te rotzooien met de software en leren op uw eigen! Er zijn ook veel tutori
Het wiel van de Arduino

Het wiel van de Arduino

Dit is een ontzagwekkend, makkelijk te maken, windmolen die kan worden gemaakt met stukken gevonden in uw eigen huis!Stap 1: Verzamelen kapstokkenKapstokken van rond uw huis te verzamelen en hen rechtzettenStap 2: Bouw een basis Bouw een basis uit PV
ESP8266 controle WS2812 Neopixel LEDs met behulp van de Arduino IDE - A Tutorial

ESP8266 controle WS2812 Neopixel LEDs met behulp van de Arduino IDE - A Tutorial

Hallo iedereen,Als u als me bent, hebt u zoekend rond het internet een goede tutorial over het gebruik van de ESP8266 met neopixel LEDs (AKA de WS2812 of WS2812b), geprogrammeerd via de Arduino IDE. Ik heb niet gevonden het allen in één plaats, in he
Het derde oog (spreker van de GPS-locatie geactiveerd met behulp van Intel Edison) (Intel IOT)

Het derde oog (spreker van de GPS-locatie geactiveerd met behulp van Intel Edison) (Intel IOT)

In dit Instructable, zal ik u tonen hoe te gebruiken, GPS-Module, Parsing GPS-gegevens van de GROOVE GPS-module op een Edison met behulp van Node.js en benodigde pakketten voor het doen van een tekst-naar-spraak espeak-bibliotheek gebruiken.Monteer h
DIY hete lucht soldeerbout met behulp van de 12-18volts DC bij 2-3 ampère

DIY hete lucht soldeerbout met behulp van de 12-18volts DC bij 2-3 ampère

dit is mijn eerste posting van eva van een DIY artikel op het web. Dus Excuseer me voor sommige typo stuff, protocol enz. De volgende instructies laten zien hoe een soldeerbout werken voor hete lucht geschikt voor alle toepassingen vereisen solderen.
Het aanpassen van elk oppervlak met behulp van Vinyl

Het aanpassen van elk oppervlak met behulp van Vinyl

dit is een uitleg over het gebruik van vinyl platen aanpassen van elk oppervlak, wat in dit geval een prullenbak. Dit instructable is een gemakkelijk-aan-volg, stapsgewijze proces van hoe de signalisatie 'ProtoTrash' kwam te zijn.Dit project werd geï
Controle LED Over WiFi met behulp van Linkit een bord

Controle LED Over WiFi met behulp van Linkit een bord

In dit instructable, ik zal u tonen hoe om LED's, of andere uitgangen, te bedienen via WiFi.Dit is gewoon te leren de basisprincipes van de Mediatek LinkIt één bestuur. Ik wilde niet iets te simpels, zoals een led knipperen omdat u dat gemakkelijk op
Met behulp van een I2C LCD op Attiny85

Met behulp van een I2C LCD op Attiny85

Met behulp van een LCD-scherm op een kleine chip als een attiny85 niet echt zo hard en tot is recente ik niet eens het gerechtvaardigd een instructable, maar ik heb vragen over, dus ik kan ook ingaan op het proces.Met de attiny gebaseerde slechts met