Stap 5: De Code deel 2
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.