Главная > Hard, Soft > Доработка Lego вездехода на Raspberry

Доработка Lego вездехода на Raspberry

В своей прошлой статье я описывал, как сделать Lego вездеход на Raspberry Pi с управлением через bluetooth. Отличием этого проекта от многих других в интернете являeтся то, что вездеход должен ещё передавать видео. Теперь он был немного доработан:

  • Улучшено сцепление с полом
  • Подсветка для ночного передвижения
  • Ультразвуковой дальномер
  • Появилось android приложение

Доработка Lego вездехода

1. Улучшение сцепления с полом

Улучшение сцепления с поломПервая проблема, которую стоило решить — улучшить сцепление с полом. Для этого идеально подходят новые резиновые детали от Lego. Они встречаются только в двух наборах — 70317 и 70595. Оба набора стоят больше 100$, что не позволяет использовать их как доноры. Придётся покупать резинки отдельно, но пока цена слишком высока.

В качестве альтернативного решения были использованы простые резинки для плетения. К сожалению, они часто рвутся, но улучшаю сцепление и уменьшают шум при передвижении.

Доработка Lego вездехода

2. Фары

Для обеспечения возможности передвижения в темноте на вездеход были поставлены светодиоды. У меня не нашлось подходящих по размеру, но после доработки надфилями имеющиеся стали, как родные.

Доработка Lego вездехода

Схема для подключения простая:

Схема подключения светодиодов к raspberryИ код:

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

Для измерения расстояния с помощью дальномера HC-SR04 нужно на него сначала подать импульс длиной 10 мкс. После этого модуль испускает 8 импульсов на частоте 40кГц и обнаруживает эхо. Расстояние до объекта пропорционально ширине эха. Вот тут и возникает серьёзная трудность при программировании доступа к нему на Raspberry Pi с помощью java. Проблема кроется в отсутствии в java механизма создания атомарных наборов операций. Из-за этого поток обработки ответа от HC-SR04 может прерваться в любой момент и значения будут искажены.

Для решения этой проблемы можно воспользоваться Arduino, которое будет работать с HC-SR04 и по UART отправлять данные на Raspberry.

Подключения HC-SR04 к Arduino

Подключения 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.

Доработка Lego вездехода

Уровень напряжения на Raspberry  — 3V, а для Arduino Nano — 5V. Поэтому нужно собрать делитель напряжения, чтоб не испортить Raspberry при передаче данных.

Схема подключения через делитель напряжения

Схема подключение Raspberry к Arduino через Serial порт

 

На сторону 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;
	}
}

Связь arduino и raspberry
4. Приложение для работы с Lego-вездеходом

Для большей мобильности в использовании своего творения сделал Android-приложение:

Android приложение для управления вездеходом

Видно, что на картинке с вездехода сейчас отображается расстояние.

Исходные коды проекта


lego and raspberry
lego and raspberry
lego and raspberry
lego and raspberry
lego and raspberry

 

Categories: Hard, Soft Tags: , , ,
  1. Kolia999
    21 Апрель 2017 в 14:42 | #1

    А как питается arduino?

  2. Admin
    21 Апрель 2017 в 17:23 | #2

    @Kolia999
    У Xiaomi Mi Power Bank 20000mAh есть два USB выхода. Один используется для Raspberry. Второй используется для Arduino Nano.

  3. Kiria
    22 Апрель 2017 в 15:37 | #3

    Интересная задумка. Но почему бы не сделать на Mindstorms?

  1. Пока что нет уведомлений.