Доработка Lego вездехода на Raspberry
В своей прошлой статье я описывал, как сделать Lego вездеход на Raspberry Pi с управлением через bluetooth. Отличием этого проекта от многих других в интернете являeтся то, что вездеход должен ещё передавать видео. Теперь он был немного доработан:
- Улучшено сцепление с полом
- Подсветка для ночного передвижения
- Ультразвуковой дальномер
- Появилось android приложение
1. Улучшение сцепления с полом
Первая проблема, которую стоило решить — улучшить сцепление с полом. Для этого идеально подходят новые резиновые детали от Lego. Они встречаются только в двух наборах — 70317 и 70595. Оба набора стоят больше 100$, что не позволяет использовать их как доноры. Придётся покупать резинки отдельно, но пока цена слишком высока.
В качестве альтернативного решения были использованы простые резинки для плетения. К сожалению, они часто рвутся, но улучшаю сцепление и уменьшают шум при передвижении.
2. Фары
Для обеспечения возможности передвижения в темноте на вездеход были поставлены светодиоды. У меня не нашлось подходящих по размеру, но после доработки надфилями имеющиеся стали, как родные.
Схема для подключения простая:
private static final GpioPinDigitalOutput light = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_04); .... public static void light(boolean onOff) { if (onOff) { light.high(); } else { light.low(); } }
3. Подключение дальномера HC-SR04
Для измерения расстояния с помощью дальномера HC-SR04 нужно на него сначала подать импульс длиной 10 мкс. После этого модуль испускает 8 импульсов на частоте 40кГц и обнаруживает эхо. Расстояние до объекта пропорционально ширине эха. Вот тут и возникает серьёзная трудность при программировании доступа к нему на Raspberry Pi с помощью java. Проблема кроется в отсутствии в java механизма создания атомарных наборов операций. Из-за этого поток обработки ответа от HC-SR04 может прерваться в любой момент и значения будут искажены.
Для решения этой проблемы можно воспользоваться Arduino, которое будет работать с HC-SR04 и по UART отправлять данные на Raspberry.
Подключения HC-SR04 к Arduino
Для программы будет использоваться уже стандартная библиотека Ultrasonic, которую нужно распаковать ко всем библиотекам Arduino.
Программа для получения и отправки данных на Raspberry:
#include <Ultrasonic.h> Ultrasonic ultrasonic(12,13); void setup() { Serial.begin(9600); } void loop() { Serial.print("D"); Serial.println(ultrasonic.Ranging(CM)); delay(300); }
Не менее интересным является крепление HC-SR04 к Lego и корпус для Arduino Nano.
Уровень напряжения на Raspberry — 3V, а для Arduino Nano — 5V. Поэтому нужно собрать делитель напряжения, чтоб не испортить Raspberry при передаче данных.
Схема подключения через делитель напряжения
На сторону Raspberry придётся ещё сделать модификацию в настройках.
$ cd /boot
$ sudo nano cmdline.txtизменить
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1
root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwaitна
dwc_otg.lpm_enable=0 console=tty1
root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
Пример кода для работы (используется PI4J v1.1):
package info.privateblog.gpio; import com.pi4j.wiringpi.Serial; public class UARTThread extends Thread { private boolean running = true; private int serialPort = 0; public UARTThread() { serialPort = Serial.serialOpen(Serial.DEFAULT_COM_PORT, 9600); } public void run() { byte[]buffer = new byte[10]; int index = 0; boolean isDistance = false; try { while (running) { if (Serial.serialDataAvail(serialPort) > 0) { byte[]charSymbols = Serial.serialGetBytes(serialPort, 1); byte charSymbol = charSymbols[0]; if (charSymbol == 'D' && !isDistance) { isDistance = true; continue; } else if (isDistance) { if (charSymbol == '\n' || charSymbol == '\r') { if (index > 0) { String value = new String(buffer, 0, index); int result = 0; try { result = Integer.parseInt(value); GPIOUtil.setDistance(result); } catch (NumberFormatException ex){ } finally { isDistance = false; index = 0; } } } else { if (index < 10) { buffer[index++] = charSymbol; } else { isDistance = false; index = 0; } } } } else { Thread.sleep(100); } } } catch (Exception e1) { System.out.println("Failed to read uart data: " + e1.getMessage()); } } public boolean isRunning() { return running; } public void setRunning(boolean running) { this.running = running; } }
4. Приложение для работы с Lego-вездеходом
Для большей мобильности в использовании своего творения сделал Android-приложение:
Видно, что на картинке с вездехода сейчас отображается расстояние.
А как питается arduino?
0
0
@Kolia999
У Xiaomi Mi Power Bank 20000mAh есть два USB выхода. Один используется для Raspberry. Второй используется для Arduino Nano.
2
0
Интересная задумка. Но почему бы не сделать на Mindstorms?
1
0
вот есть лего вездеход, не машина, монстр… но нехватает портов под моторы и под датчики…
хотим вынуть EV3 мозг и установить Raspberry…
посоветуйте оптимальный алгоритм действий?
в первую очередь как связать с моторами лего ?
0
0
к сожалению пока не пробовал
Есть в интернете проект BrickPi, но там только 4 мотора и 4 сенсора.
0
0