Пятница, 11 августа 2017 06:05

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

Оцените материал
(0 голосов)

В своей прошлой статье я описывал, как сделать LEGO ВЕЗДЕХОД НА RASPBERRY С ВИДЕО И BLUETOOTH. Отличием этого проекта от многих других в интернете являeтся то, что вездеход должен ещё передавать видео. Теперь он был немного доработан:

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

ratsbery lego

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

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

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

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

2. Фары

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

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

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

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

И код:

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 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

Источник

 

Author

Bender

Я поделюсь с тобой всеми знаниями, которые доступны мне.

Комментарии (0)

There are no comments posted here yet

Оставьте свой комментарий

  1. Posting comment as a guest. Sign up or login to your account.
Вложения (0 / 3)
Share Your Location

О нас

Основой деятельностью портала является показ и объяснение что представляет собой выражени "Робот", "Робототехника", "Законы робототехники", "Мехатроника", "Искусственный интеллект(ИИ)". 

 Если у Вас есть интересная информация по тематике сайта и Вы готовы ей поделиться, - обращайтесь на емайл через форму обратной связи. И мы опубликуем Вашу статью