Радиоуправляемая машина с джойстиком
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Об этом проекте
1. Бери машину!
Прежде всего вам понадобится старая радиоуправляемая машина. К счастью, я нашел грузовик-монстр. Это может быть очень интересно!
Снимите всю электронику, кроме кабелей для управления двумя двигателями.
2. Ардуино и щит
Возьмите плату Arduino (я выбрал Arduino UNO) и подключите к ней экран хоста USB.
3. Присоедините Arduino к автомобилю
Подключите экран сверху Arduino UNO и экран хоста USB и прикрутите их к автомобилю. Я использовал одно из отверстий для старой электронной схемы.
4. Сделайте схему
Я сделал свой на макете, но вы также можете построить его на перфокартоне. По сути, схема состоит из двух драйверов (L293D или SN754410) и двух стабилизаторов напряжения. Стабилизаторы напряжения используются для ограничения напряжения от аккумуляторов. Фактически, я предлагаю вам использовать 10-12 батарей AA 1,5 В, чтобы иметь максимальное напряжение 15-18 В, что даст вам больше времени для игры с радиоуправляемым автомобилем. Поскольку двигателю требуется большой ток, для того, чтобы вывести автомобиль из положения покоя (около 2 А), нам понадобится мощный стабилизатор напряжения, такой как 78S12.
Если вам нужна дополнительная информация о том, как работает драйвер, загляните сюда!
5. Присоедините цепь к автомобилю
Найдите свободное место на радиоуправляемой машине, где вы можете разместить схему. На моем монстр-траке много места. После установки подключите цепь к двум двигателям. Наконец, подключите беспроводной приемник к экрану USB-хоста.
6. Код
Код основан на примерах библиотеки USB Host Library 2.0, размещенной на GitHub Кристианом Лаусусом из схем @ home
USB_Host_Shield_2.0 / * Пример скетча для библиотеки Xbox Wireless Reciver - разработан Кристианом Лаусусом. Он поддерживает до четырех контроллеров по беспроводной сети. Для получения дополнительной информации см. Сообщение в блоге:http://blog.tkjelectronics.dk/2012/12 / xbox-360-Receiver-added-to-the-usb-host-library / или отправьте мне электронное письмо:[email protected]*/#include // Удовлетворительная IDE, которую нужно только увидеть статус включения в ino. # ifdef dobogusinclude # include #endifUSB Usb; XBOXRECV Xbox (&Usb); # define motorPinOne 5 // Выбранный контакт должен иметь PWM # define motorPinTwo 6 // Выбранный контакт должен иметь PWM # define motor2PinOne 4 #define motor2PinTwo 7 # define BRAKE 2 / * Определение скорости вращения двигателя. ДОЛЖЕН быть от 0 до 255. * / int pulse =0; int forward =0; int Brake_on =0; void setup () {TCCR1B =TCCR1B &0b11111000 | 0x02; Serial.begin (115200); if (Usb.Init () ==-1) {Serial.print (F ("\ r \ nOSC не запустился")); в то время как (1); // остановка motors_stop (); центр(); } Serial.print (F ("\ r \ nБиблиотека беспроводного приемника Xbox запущена")); pinMode (motorPinOne, ВЫХОД); pinMode (motorPinTwo, ВЫХОД); pinMode (motor2PinOne, ВЫХОД); pinMode (motor2PinTwo, ВЫХОД); pinMode (ТОРМОЗ, ВЫХОД); digitalWrite (ТОРМОЗ, НИЗКИЙ);} недействительный цикл () {Usb.Task (); если (Xbox.XboxReceiverConnected) {для (uint8_t я =0; я <4; я ++) {если (Xbox.getButtonPress (L2, я)) {Serial.print ("L2:"); Serial.print (Xbox.getButtonPress (L2, i)); Pulse =Xbox.getButtonPress (L2, i); вперед =0; по часовой стрелке (); } если (Xbox.getButtonPress (R2, i)) {Serial.print ("R2:"); Serial.println (Xbox.getButtonPress (R2, i)); Pulse =Xbox.getButtonPress (R2, i); вперед =1; против часовой стрелки(); } if (Xbox.getAnalogHat (LeftHatX, i)> 7500 || Xbox.getAnalogHat (LeftHatX, i) <-7500 || Xbox.getAnalogHat (LeftHatY, i)> 7500 || Xbox.getAnalogHat (LeftHatY, i) <- 7500 || Xbox.getAnalogHat (RightHatX, i)> 7500 || Xbox.getAnalogHat (RightHatX, i) <-7500 || Xbox.getAnalogHat (RightHatY, i)> 7500 || Xbox.getAnalogHat (RightHatY, i) <- 7500) {если (Xbox.getAnalogHat (LeftHatX, i)> 7500) {Serial.print (F ("LeftHatX:")); Serial.print (Xbox.getAnalogHat (LeftHatX, i)); Serial.print ("\ t"); если (Xbox.getAnalogHat (LeftHatX, i)> 26000) turn_right (); иначе центр (); } если (Xbox.getAnalogHat (LeftHatX, i) <-7500) {Serial.print (F ("LeftHatX:")); Serial.print (Xbox.getAnalogHat (LeftHatX, i)); Serial.print ("\ t"); если (Xbox.getAnalogHat (LeftHatX, i) <-26000) turn_left (); иначе центр (); } if (Xbox.getAnalogHat (LeftHatY, i)> 7500 || Xbox.getAnalogHat (LeftHatY, i) <-7500) {Serial.print (F ("LeftHatY:")); Serial.print (Xbox.getAnalogHat (LeftHatY, i)); Serial.print ("\ t"); } если (Xbox.getAnalogHat (RightHatX, i)> 7500) {Serial.print (F ("RightHatX:")); Serial.print (Xbox.getAnalogHat (RightHatX, i)); Serial.print ("\ t"); } если (Xbox.getAnalogHat (RightHatX, i) <-7500) {Serial.print (F ("RightHatX:")); Serial.print (Xbox.getAnalogHat (RightHatX, i)); Serial.print ("\ t"); } if (Xbox.getAnalogHat (RightHatY, i)> 7500 || Xbox.getAnalogHat (RightHatY, i) <-7500) {Serial.print (F ("RightHatY:")); Serial.print (Xbox.getAnalogHat (RightHatY, i)); } Serial.println (); } if (Xbox.getButtonClick (UP, i)) {Serial.println (F ("Up")); } if (Xbox.getButtonClick (ВНИЗ, я)) {Serial.println (F ("Вниз")); } if (Xbox.getButtonClick (LEFT, i)) {Serial.println (F ("Left")); } if (Xbox.getButtonClick (RIGHT, i)) {Serial.println (F ("Right")); } if (Xbox.getButtonClick (START, i)) {Serial.println (F ("Старт")); } if (Xbox.getButtonClick (BACK, i)) {Serial.println (F ("Назад")); } if (Xbox.getButtonClick (L3, i)) Serial.println (F ("L3")); если (Xbox.getButtonClick (R3, i)) Serial.println (F ("R3")); если (Xbox.getButtonClick (L1, i)) Serial.println (F ("L1")); если (Xbox.getButtonClick (R1, i)) Serial.println (F ("R1")); если (Xbox.getButtonClick (XBOX, i)) {Xbox.setLedMode (ВРАЩЕНИЕ, i); Serial.println (F («Xbox»)); } if (Xbox.getButtonClick (A, i)) {Serial.println (F ("A")); } if (Xbox.getButtonClick (B, i)) {Serial.println (F ("B")); digitalWrite (ТОРМОЗ, ВЫСОКИЙ); Brake_on =1; импульс =100; если (вперед) по часовой стрелке (); иначе против часовой стрелки (); } if (Xbox.getButtonClick (X, i)) Serial.println (F ("X")); если (Xbox.getButtonClick (Y, i)) {Serial.println (F ("Y")); motors_stop (); }}} delay (1);} void clockwise () {Serial.print ("Вращение по часовой стрелке, а скорость равна"); Serial.println (импульс); analogWrite (motorPinOne, pulse); // устанавливаем ногу 1 H-моста в низкий уровень analogWrite (motorPinTwo, 0); если (тормоз_он) {задержка (600); digitalWrite (ТОРМОЗ, НИЗКИЙ); Brake_on =0; импульс =0; }} void counterClockwise () {Serial.print ("Вращение против часовой стрелки, скорость равна"); Serial.println (импульс); analogWrite (motorPinOne, 0); // устанавливаем ногу 1 H-моста в низкий уровень analogWrite (motorPinTwo, pulse); если (тормоз_он) {задержка (600); digitalWrite (ТОРМОЗ, НИЗКИЙ); Brake_on =0; импульс =0; }} void turn_left () {digitalWrite (motor2PinOne, HIGH); // устанавливаем ногу 1 H-моста в низкий уровень digitalWrite (motor2PinTwo, LOW);} void turn_right () {digitalWrite (motor2PinOne, LOW); // устанавливаем ногу 1 H-моста в низкий уровень digitalWrite (motor2PinTwo, HIGH);} void motors_stop () {analogWrite (motorPinOne, 0); analogWrite (motorPinTwo, 0); Pulse =0;} void center () {digitalWrite (motor2PinOne, LOW); digitalWrite (motor2PinTwo, LOW);}
Код
- Фрагмент кода №1
Фрагмент кода №1 Arduino
/ * Пример скетча для библиотеки беспроводного ресивера Xbox - разработан Кристианом Лаусусом. Он поддерживает до четырех контроллеров по беспроводной сети. Для получения дополнительной информации см. сообщение в блоге:http://blog.tkjelectronics.dk/2012/12/xbox-360 -receiver-added-to-the-usb-host-library / или отправьте мне электронное письмо:[email protected] * / # include// Удовлетворите IDE, которой нужно только увидеть статус включения в ino. # ifdef dobogusinclude # include #endifUSB Usb; XBOXRECV Xbox (&Usb); # define motorPinOne 5 // Выбранный контакт должен иметь PWM # define motorPinTwo 6 // Выбранный контакт должен иметь PWM # define motor2PinOne 4 #define motor2PinTwo 7 # define BRAKE 2 / * Определение скорости вращения двигателя. ДОЛЖЕН быть от 0 до 255. * / int pulse =0; int forward =0; int Brake_on =0; void setup () {TCCR1B =TCCR1B &0b11111000 | 0x02; Serial.begin (115200); if (Usb.Init () ==-1) {Serial.print (F ("\ r \ nOSC не запустился")); в то время как (1); // остановка motors_stop (); центр(); } Serial.print (F ("\ r \ nБиблиотека беспроводного приемника Xbox запущена")); pinMode (motorPinOne, ВЫХОД); pinMode (motorPinTwo, ВЫХОД); pinMode (motor2PinOne, ВЫХОД); pinMode (motor2PinTwo, ВЫХОД); pinMode (ТОРМОЗ, ВЫХОД); digitalWrite (ТОРМОЗ, НИЗКИЙ);} недействительный цикл () {Usb.Task (); если (Xbox.XboxReceiverConnected) {для (uint8_t я =0; я <4; я ++) {если (Xbox.getButtonPress (L2, я)) {Serial.print ("L2:"); Serial.print (Xbox.getButtonPress (L2, i)); Pulse =Xbox.getButtonPress (L2, i); вперед =0; по часовой стрелке (); } если (Xbox.getButtonPress (R2, i)) {Serial.print ("R2:"); Serial.println (Xbox.getButtonPress (R2, i)); Pulse =Xbox.getButtonPress (R2, i); вперед =1; против часовой стрелки(); } if (Xbox.getAnalogHat (LeftHatX, i)> 7500 || Xbox.getAnalogHat (LeftHatX, i) <-7500 || Xbox.getAnalogHat (LeftHatY, i)> 7500 || Xbox.getAnalogHat (LeftHatY, i) <- 7500 || Xbox.getAnalogHat (RightHatX, i)> 7500 || Xbox.getAnalogHat (RightHatX, i) <-7500 || Xbox.getAnalogHat (RightHatY, i)> 7500 || Xbox.getAnalogHat (RightHatY, i) <- 7500) {если (Xbox.getAnalogHat (LeftHatX, i)> 7500) {Serial.print (F ("LeftHatX:")); Serial.print (Xbox.getAnalogHat (LeftHatX, i)); Serial.print ("\ t"); если (Xbox.getAnalogHat (LeftHatX, i)> 26000) turn_right (); иначе центр (); } если (Xbox.getAnalogHat (LeftHatX, i) <-7500) {Serial.print (F ("LeftHatX:")); Serial.print (Xbox.getAnalogHat (LeftHatX, i)); Serial.print ("\ t"); если (Xbox.getAnalogHat (LeftHatX, i) <-26000) turn_left (); иначе центр (); } if (Xbox.getAnalogHat (LeftHatY, i)> 7500 || Xbox.getAnalogHat (LeftHatY, i) <-7500) {Serial.print (F ("LeftHatY:")); Serial.print (Xbox.getAnalogHat (LeftHatY, i)); Serial.print ("\ t"); } если (Xbox.getAnalogHat (RightHatX, i)> 7500) {Serial.print (F ("RightHatX:")); Serial.print (Xbox.getAnalogHat (RightHatX, i)); Serial.print ("\ t"); } если (Xbox.getAnalogHat (RightHatX, i) <-7500) {Serial.print (F ("RightHatX:")); Serial.print (Xbox.getAnalogHat (RightHatX, i)); Serial.print ("\ t"); } if (Xbox.getAnalogHat (RightHatY, i)> 7500 || Xbox.getAnalogHat (RightHatY, i) <-7500) {Serial.print (F ("RightHatY:")); Serial.print (Xbox.getAnalogHat (RightHatY, i)); } Serial.println (); } if (Xbox.getButtonClick (UP, i)) {Serial.println (F ("Up")); } if (Xbox.getButtonClick (ВНИЗ, я)) {Serial.println (F ("Вниз")); } if (Xbox.getButtonClick (LEFT, i)) {Serial.println (F ("Left")); } if (Xbox.getButtonClick (RIGHT, i)) {Serial.println (F ("Right")); } if (Xbox.getButtonClick (START, i)) {Serial.println (F ("Старт")); } if (Xbox.getButtonClick (BACK, i)) {Serial.println (F ("Назад")); } if (Xbox.getButtonClick (L3, i)) Serial.println (F ("L3")); если (Xbox.getButtonClick (R3, i)) Serial.println (F ("R3")); если (Xbox.getButtonClick (L1, i)) Serial.println (F ("L1")); если (Xbox.getButtonClick (R1, i)) Serial.println (F ("R1")); если (Xbox.getButtonClick (XBOX, i)) {Xbox.setLedMode (ВРАЩЕНИЕ, i); Serial.println (F («Xbox»)); } if (Xbox.getButtonClick (A, i)) {Serial.println (F ("A")); } if (Xbox.getButtonClick (B, i)) {Serial.println (F ("B")); digitalWrite (ТОРМОЗ, ВЫСОКИЙ); Brake_on =1; импульс =100; если (вперед) по часовой стрелке (); иначе против часовой стрелки (); } if (Xbox.getButtonClick (X, i)) Serial.println (F ("X")); если (Xbox.getButtonClick (Y, i)) {Serial.println (F ("Y")); motors_stop (); }}} delay (1);} void clockwise () {Serial.print ("Вращение по часовой стрелке, а скорость равна"); Serial.println (импульс); analogWrite (motorPinOne, pulse); // устанавливаем ногу 1 H-моста в низкий уровень analogWrite (motorPinTwo, 0); если (тормоз_он) {задержка (600); digitalWrite (ТОРМОЗ, НИЗКИЙ); Brake_on =0; импульс =0; }} void counterClockwise () {Serial.print ("Вращение против часовой стрелки, скорость равна"); Serial.println (импульс); analogWrite (motorPinOne, 0); // устанавливаем ногу 1 H-моста в низкий уровень analogWrite (motorPinTwo, pulse); если (тормоз_он) {задержка (600); digitalWrite (ТОРМОЗ, НИЗКИЙ); Brake_on =0; импульс =0; }} void turn_left () {digitalWrite (motor2PinOne, HIGH); // устанавливаем ногу 1 H-моста в низкий уровень digitalWrite (motor2PinTwo, LOW);} void turn_right () {digitalWrite (motor2PinOne, LOW); // устанавливаем ногу 1 H-моста в низкий уровень digitalWrite (motor2PinTwo, HIGH);} void motors_stop () {analogWrite (motorPinOne, 0); analogWrite (motorPinTwo, 0); Pulse =0;} void center () {digitalWrite (motor2PinOne, LOW); digitalWrite (motor2PinTwo, LOW);}
Github
https://github.com/felis/USB_Host_Shield_2.0https://github.com/felis/USB_Host_Shield_2.0Производственный процесс
- Робот Raspberry Pi, управляемый через Bluetooth
- Интерактивный настольный светильник, управляемый жестами
- Светодиоды, управляемые Alexa через Raspberry Pi
- Роботизированная рука, управляемая нунчук (с Arduino)
- Arduino Nano:управление двумя шаговыми двигателями с помощью джойстика
- Робот, управляемый речью
- Счетчик автомобилей с использованием Arduino + Обработка + PHP
- Робот-пианино, управляемый Arduino:PiBot
- Wi-Servo:серводвигатели, управляемые через браузер Wi-Fi
- Джойстик Arduino