Stap 6: Tweede programma: Servo uitgang
Nu begint de pret! Met behulp van het programma die ik eerder heb geschetst, kunt sommige servo-output met behulp van de standaard servo-bibliotheek toevoegen. Ik heb ook besloten om een matrix van de invoergegevens in plaats van acht afzonderlijke variabelen gebruiken. Hebt u een Uno, die mij zal zitten using laatstgenoemde, alles wat je hoeft te doen is de pin locatie variabelen wijzigen.
Dit zal zal schetsen Lees alle 8 kanalen van een RC-ontvanger en de waarden via seriële monitor input.
Geprogrammeerd voor de Arduino MEGA 2560
Opgenomen bibliotheken
#include < Servo.h >
Variabelen definiëren:
Const int chA = 22; Constante variabelen met betrekking tot pin locaties
Const int chB = 27;
Const int chC = 30;
Const int chD = 35;
Const int chE = 38;
Const int chF = 43;
Const int chG = 46;
Const int chH = 51;
Signaal Conditioning grenzen
Const int lo = 920;
Const int hi = 1640;
Const int deadlo = 1270;
Const int deadhi = 1290;
Const int centrum = 1280;
int ch [8]; Array opslaan en weergeven van de waarden van elk kanaal
int ch4; Servo uitgang variabele
Servo steer; Stuur Servo
de setup-routine wordt uitgevoerd zodra wanneer u drukt op reset:
VOID Setup
{
Initialiseer seriële communicatie met 9600 bits per seconde:
Serial.begin(9600);
Input Pins:
pinMode(chA,INPUT);
pinMode(chB,INPUT);
pinMode(chC,INPUT);
pinMode(chD,INPUT);
pinMode(chE,INPUT);
pinMode(chF,INPUT);
pinMode(chG,INPUT);
pinMode(chH,INPUT);
Servo-uitgangen:
Steer.attach(2); Stuur Servo koppelen aan PWM Pin 2
}
Hoofdprogramma
void loop
{
Lees de ingangskanalen
CH [0] = pulseIn (chA, hoge); Lezen en opslaan van kanaal 1
CH [1] = pulseIn (chB, hoge);
CH [2] = pulseIn (chC, hoge);
CH [3] = pulseIn (chD, hoge);
CH [4] = pulseIn (chE, hoge);
CH [5] = pulseIn (chF, hoge);
CH [6] = pulseIn (chG, hoge);
CH [7] = pulseIn (chH, hoge);
Input signaal conditioning
for (int i = 0; ik < = 8; i ++) //Signal Conditioning lus
{
Als (ch [i] < = lo) //Trim geluid vanaf de onderkant
{
CH [i] = lo;
}
Als (ch [i] < = deadhi & & ch [i] > = deadlo) //Create Dead-Band
{
CH [i] = midden;
}
Als (ch [i] > = Hallo) //Trim lawaai van bovenkant
{
CH [i] = Hallo;
}
}
Stuur controle Output op kanaal 4
CH4 = ch [3];
Als (ch4 > = lo & & ch4 < = deadlo)
{
CH4 = kaart (ch4, lo, deadlo, 0, 90);
}
anders als (ch4 == center)
{
CH4 = 90;
}
anders als (ch4 > = deadhi & & ch4 < = Hallo)
{
CH4 = kaart (ch4, deadhi, Hallo, 90, 180);
}
Steer.write(CH4);
Seriële uitgangen
Serial.Print ("Ch1:"); Tekenreeks op seriële Monitor te onderscheiden van variabelen weergeven
Serial.Print (ch[0]); Afdrukken in de waarde van kanaal 1
Serial.Print ("|");
Serial.Print ("Ch2:");
Serial.Print (ch[1]);
Serial.Print ("|");
Serial.Print ("Ch3:");
Serial.Print (ch[2]);
Serial.Print ("|");
Serial.Print ("Ch4:");
Serial.Print (ch[3]);
Serial.Print ("|");
Serial.Print ("H5:");
Serial.Print (ch[4]);
Serial.Print ("|");
Serial.Print ("H6:");
Serial.Print (ch[5]);
Serial.Print (& v. uot; | ");
Serial.Print ("H7:");
Serial.Print (ch[6]);
Serial.Print ("|");
Serial.Print ("Ch8:");
Serial.println (ch[7]);
Serial.Print ("sturende Output:");
Serial.println (ch4);
}
Ik ga ervan uit dat de servo had een zenuwinzinking en een lichte tik ontwikkelde? Het terminal-venster bevestigt dat de wielen gewoon viel OFF van uw project, nu wat? Voordat u uw servo of Arduino aan het huis van de moer committeren is het iets dat kan worden gewerkt rond. Het probleem is hoe de Arduino servo bibliotheek de gewenste output signaal genereert. Het onderbreekt het hoofdprogramma te handhaven van de 50Hz pols en zal in strijd zijn met de pulsein functie corrumperende valuesbeing lezen. Zowel de servo-bibliotheek en de pulsein zijn interrupt gebaseerd maar welke we kijken vervangen? Ik koos voor het elimineren van de servo-bibliotheek na veel google-fu.