Arduino nano, ñåðâîìîòîð è äæîéñòèê |
Çàâàëÿëàñü ó ìåíÿ arduino nano (êà÷åñòâåííûé êèòàéñêèé êëîí îò RobotDyn). À òóò íà äíÿõ òàê æå èç Êèòàÿ ïðèøëè ñåðâîìîòîð è ìàíèïóëÿòîð, à òàê æå íàøëîñü âðåìÿ, ÷òîáû íåìíîãî ðàçîáðàòüñÿ ñ ýòèì. Èòàê, öåëü ó ìåíÿ áûëà ïðîñòàÿ: ñîåäèíèòü arduino uno, ñåðâîìîòîð è äæîéñòèê, è çàñòàâèòü ñåðâîìîòîð ïîâîðà÷èâàòüñÿ ïðè ïîâîðîòå äæîéñòèêà.  ïðàêòè÷åñêèõ öåëÿõ ýòî ìîæíî èñïîëüçîâàòü, íàïðèìåð, äëÿ óïðàâëåíèÿ ïîâîðîòîì êàìåðû.
Êàê îêàçàëîñü, ýòî íå òàê óæ è ñëîæíî. Ñõåìà ïîäêëþ÷åíèÿ ñëåäóþùàÿ:
1. Arduino è ñåðâîìîòîð:
2. Arduino è äæîéñòèê:
Ñîåäèíÿåì âñå íàøè ÷óäà êèòàéñêîãî ïðîèçâîäñòâà, ïîäêëþ÷àåì arduino ê êîìïüþòåðó, îòêðûâàåì Arduino IDE, çàëèâàåì ñêåò÷, óêàçàííûé íèæå. Ïîñëå çàãðóçêè ñêåò÷à ìîæíî äâèãàòü ìàíèïóëÿòîðîì â ñòîðîíû, ñåðâîìîòîð áóäåò ïîâîðà÷èâàòüñÿ .
#include <Servo.h> //Áèáëèîòåêà äëÿ ðàáîòû ñ ñåðâîìîòîðîì
int xPin = A1; //À1 - àíàëîãîâûé ñèãíàë Õ êîîðäèíàò äæîéñòèêà
int yPin = A0; //À0 - àíàëîãîâûé ñèãíàë Ó êîîðäèíàò äæîéñòèêà
int buttonPin = 2; // Ïèí äëÿ ðåæèìà êíîïêè (íàæàòà èëè îòïóùåíà)
int xPosition = 0; // ïåðåìåííàÿ äëÿ õðàíåíèÿ òåêóùåé ïîçèöèè äæîéñòèêà ïî îñè X
int yPosition = 0; // ïåðåìåííàÿ äëÿ õðàíåíèÿ òåêóùåé ïîçèöèè äæîéñòèêà ïî îñè Y
int buttonState = 0; //òåêóùåå ñîñòîÿíèå êíîïêè (íàæàòà)
int servoPin = 8; // ïèí äëÿ ñèãíàëîâ ñ ñåðâîìîòîðà
Servo servo; // ïåðåìåííàÿ òèïà Servo
int angle = 90; //ñòàðòîâûé óãîë ïîâîðîòà ñåðâîìîòîðà
int currentXpos = 0; //Òåêóùàÿ ïîçèöèÿ X
void setup() {
pinMode(xPin, INPUT); // Ñèãíàë ñ xPin îïðåäåëÿåì êàê âõîäíîé ñèãíàë
pinMode(yPin, INPUT); // Ñèãíàë ñ yPin îïðåäåëÿåì êàê âõîäíîé ñèãíàë
pinMode(buttonPin, INPUT_PULLUP); // àêòèâèðóåì ïîäòÿãèâàþùèé ðåçèñòîð íà ïèíå êíîïêè
servo.attach(servoPin); // ïðèñîåäèíÿåì ïèí
servo.write(angle); // Ïîâîðà÷èâàåì ñåðâîìîòîð íà 90 ãðàäóñîâ
}
void loop() {
xPosition = analogRead(xPin); // ÷èòàåì çíà÷åíèå xPin
yPosition = analogRead(yPin); // ÷èòàåì çíà÷åíèå yPin
buttonState = digitalRead(buttonPin); // ÷èòàåì 'ñîñòîÿíèå' êíîïêè
//åñëè çíà÷åíèå xPosition áîëüøå 360
if(xPosition > 360) {
angle = angle-10; // óìåíüøàåì óãîë ïîâîðîòà íà 10 ãðàäóñîâ
// åñëè óãîë ìåíüøå 0
if(angle < 0) {
angle = 0; //óñòàíàâëèâàåì çíà÷åíèå óãëà 0 ãðàäóñîâ
}
}
//åñëè xPosition ìåíüøå 300
if(xPosition < 300) {
angle = angle+10; // óâåëè÷èâàåì óãîë ïîâîðîòà ñåðâîìîòîðà íà 10 ãðàäóñîâ
//åñëè óãîë ïîâîðîòà áîëüøå 180 ãðàäóñîâ
if(angle > 180) {
angle = 180; //óñòàíàâëèâàåì çíà÷åíèå óãëà â 180 ãðàäóñîâ
}
}
// åñëè íàæàòà êíîïêà äæîéñòèêà
if(buttonState == 0)
{
angle = 90; //óñòàíàâëèâàåì óãîë â 90 ãðàäóñîâ
}
servo.write(angle); // ïîâîðà÷èâàåì ñåðâîìîòîð íà íóæíûé óãîë
delay(50); // äîáàâëÿåì çàäåðæêó ìåæäó ñ÷èòûâàíèåì äàííûõ
}

Ïðè ïîäêëþ÷åíèè äæîéñòèêà ê ïèòàíèþ 3.3V çíà÷åíèå ïî óìîë÷àíèþ äëÿ X è Y ïîçèöèé áûëî 330 (ïðè ïîäêëþ÷åíèè ê 5V çíà÷åíèÿ ìîãóò áûòü äðóãèå), äëÿ ïðîâåðêè çíà÷åíèé òåêóùèõ ïîêàçàíèé è ÿ âçÿë îòêëîíåíèå îò íà÷àëüíîãî çíà÷åíèÿ â 30 åäèíèö.
Îòñëåäèòü çíà÷åíèÿ àíàëîãîâûõ ñèãíàëîâ ìîæíî ñ ïîìîùüþ ìîíèòîðà ñåðèéíîãî ïîðòà (îòêðûòü åãî ìîæíî òàê: èíñòðóìåíòû -> ìîíèòîð ïîðòà èëè CTRL + SHIFT + M). Äëÿ ýòîãî â ôóíêöèè setup() íåîáõîäèìî íàïèñàòü ñëåäóþùåå:
Serial.begin(9600); // èíèöèàëèçàöèÿ îáìåíà äàííûìè ïî ñåðèéíîìó ïðîòîêîëó ñî ñêîðîñòüþ 9600 bps
 ôóíêöèè loop() íàïèñàòü ñëåäóþùåå:
Serial.print("X: ");
Serial.print(xPosition);
Serial.print(" | Y: ");
Serial.print(yPosition);
Serial.print(" | Button: ");
Serial.println(buttonState);
Èòàê, â äàííîé ñòàòüå ðàññìîòðåí ïðîöåññ ïîäêëþ÷åíèÿ ñåðâîìîòîðà è äæîéñòèêà ê Arduino Uno, ïðèâåäåí ïðèìåð ñêåò÷à.  äàëüíåéøåì ÿ ïëàíèðóþ ïîäêëþ÷èòü âòîðîé ñåðâîìîòîð, ÷òîáû ïîëüíîñòüþ èñïîëüçîâàòü âîçìîæíîñòè äæîéñòèêà è îñóùåñòâëÿòü ïîâîðîò ïî îñÿì X è Y.
Îðèãèíàë ñòàòüè, à òàê æå âèäåî çäåñü http://dev58.ru/articles/arduino_nano_servomotor_i_joystick
| Êîììåíòèðîâàòü | « Ïðåä. çàïèñü — Ê äíåâíèêó — Ñëåä. çàïèñü » | Ñòðàíèöû: [1] [Íîâûå] |