Управление сервоприводом при помощи Arduino и Java приложения

Вы когда нибудь хотели управлять различными приборами при помощи компьютера? Или разработать свой собственный USB  гаджет? Лично я - да. Именно это  желание заставило меня начать увлекаться микроконтроллерами и изобретать всякие электронные штуки. В данном примере будем управлять сервомашинкой 9g. При помощи приложения на языке программирования java. Про то как управлять сервоприводом было кратко сказано ранее. Будем  использовать среду разработки NetBeanse 7.1 IDE. Конечно можно использовать язык processing где уже есть готовые библиотеки для обмена данными. Но сам этот язык сделан на java что накладывает на этот язык определенные рамки. Насколько я понимаю processing это средство визуализации данных. В то время как java это мощный инструмент программирования.

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

Схема подключения довольно проста, которая состоит из платы Arduino(в моем примере это Arduino Mega2560) и сервопривода.  Сервомашинка имеет три вывода, два это питание и один это управляющий вывод. Куда подключать выводы питания говорить не  буду - и так все понятно , а вот линию данных нужно подсоединить к тому выводу Arduino к которому привязан сервопривод - настройка осуществляется в программе. Управление сервоприводом происходит путем изменения длины импульса поступающего на вход линии данных. Для этого в среде Arduino существует специальная библиотека Servo. Которая имеет ряд простых методов и которая  позволит с легкостью позиционировать сервопривод.

Настройка проекта

  • Скачиваем набор разработчика JDK;
  • Устанавливаем Netbeanse;
  • Устанавливаем библиотеку RXTX.

Последню версию JDK и NetBeanse можно скачать с официального сайта java. Все бесплатно и общедоступно.

Далее нам необходимо скачать библиотеку RXTX которая позволит нам обмениваться  с внешними устройствами по UART интерфейсу. Скачать библиотеку RXTX можно здесь. С ее помощью можно как передавать данные так и принимать их. Выбираем нужную версию под 32 или 64 ОС.
У меня на компьютере был установлен XP. Под  64 битную ОС тоже должно все заработать.
В этой библиотеке 3 файла.

  • rxtx.jar;
  • rxtxParallel.dll;
  • rxtxSerial.dll.

Их нужно скопировать в папку с установленным jdk,
RXTXcomm.jar скопировать в \jre\lib\ext (under java),
rxtxSerial.dll и rxtxParallel.dll скопировать в \jre\bin.

Исходный код для java

package serial;

import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
public class SerialServo implements SerialPortEventListener{
		SerialPort serialPort;
	        private InputStream input;
		private OutputStream output;
		private static final int TIME_OUT = 2000;
		private static final int DATA_RATE = 9600;
		private static final String PORT_NAMES[] = { 
				"/dev/tty.usbserial-A9007UX1", // Mac OS X
				"/dev/ttyUSB0", // Linux
				"COM4", // Windows
				};
                
		
		public void initialize() {
			CommPortIdentifier portId = null;
			Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();
			while (portEnum.hasMoreElements()) {
				CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
				for (String portName : PORT_NAMES) {
					if (currPortId.getName().equals(portName)) {
						portId = currPortId;
						break;
					}
				}
			}
			if (portId == null) {
				System.out.println("Could not find COM port.");
				return;
			}else{
				System.out.println("Found your Port");
			}
			try {
				// open serial port, and use class name for the appName.
				serialPort = (SerialPort) portId.open(this.getClass().getName(),TIME_OUT);
				// set port parameters
				serialPort.setSerialPortParams(DATA_RATE,
						SerialPort.DATABITS_8,
						SerialPort.STOPBITS_1,
						SerialPort.PARITY_NONE);
				// open the streams
				input = serialPort.getInputStream();
				output = serialPort.getOutputStream();
				// add event listeners
				serialPort.addEventListener(this);
				serialPort.notifyOnDataAvailable(true);
			} catch (Exception e) {
				System.err.println(e.toString());
			}
		}
		
	
		public synchronized void close() {
			if (serialPort != null) {
				serialPort.removeEventListener();
				serialPort.close();
			}
		}
		
	
		public void sendSingleByte(byte myByte){
			try {
                            
                            
                            
				output.write(myByte);
				output.flush();
			} catch (Exception e) {
				System.err.println(e.toString());
			}
		}
		
	
		public synchronized void serialEvent (SerialPortEvent oEvent) {
			if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
				try {
					int myByte=input.read();
					int value = myByte & 0xff;//byte to int conversion:0...127,-127...0 -> 0...255
					if(value>=0 && value<256){
						System.out.println(value);
			
					}
				} catch (Exception e) {
					System.err.println(e.toString());
				}
			}
		}
	}

 

Данные класс имеет два основных метода. Первый метод это sendSingleByte(), с его помощью мы можем послать 1 байт в сериал порт. Второй метод serialEvent(), он вызывается автоматически когда на входе появляются данные. Для того чтобы начать управление нам нужно создать объект данного класса, и вызывать его методы. Тут приведен только один класс.

Скачать проект управления сервомашинкой по среду NetBeanse IDE.

Исходный код для Arduino

#include <Servo.h> 
  Servo myservo; 
int pos = 0; 
byte bytev=0;
 
void setup() {
myservo.attach(9);
Serial.begin(9600);
}
void loop() {
myservo.write(pos);              
delay(15); 
}
void serialEvent() {
  while (Serial.available()) {
    bytev= (byte)Serial.read();
     pos = map(bytev,0,127,0,180);
             
    }
  }

 

 Ну тут все понятно, импортируем библиотеку для работы с сервомашинкой, объявляем две переменные для получения данных и позиционирования "сервы". В методе loop() посылаем данный с промежутком в 15мс. Как видно из программы подключение осуществляется к 9 выводу.

 

Комментарии  

 
#1 Сергей 28.09.2014 01:01
Спасибо ! Работает!
Единственное - в коде ардуино первые строки заменил на:

#include
Servo myservo;

Иначе не компилировалось )
Цитировать
 
 
#2 Сергей 28.09.2014 01:08
Блин, часть предыдущего поста потерялась(такж е как и в коде автора), короче, первые строки нужно взять из примеров ардуино (Файл/Пимеры/Se rvo/Knob).
Цитировать
 
 
#3 Игорь 13.05.2015 13:40
Здравствуйте , я как бы не силен в этих делах) не могли бы вы чиркануть мне код на 2 серва с теми же параметрами =)
Цитировать
 
 
#4 Игорь 13.05.2015 13:41
код всмысле исходник для ардуины
Цитировать
 
 
#5 Михан 13.05.2015 13:43
При помощи библиотеки Firmata это можно сделать :-) Ес найду код скину
Цитировать
 
 
#6 Игорь 13.05.2015 13:49
ок)
Я с джава не заморачивался нашел готовую прогу с похожим смыслом http://alex-exe.ru/programm/program-control-4serva-com/ , изменил последнюю строчку из кода ардуины pos = map(bytev,0,127 ,0,180); на pos = map(bytev,0,60, 0,180); , и пользуюсь 1 бегунком програмки))
Цитировать
 
 
#7 Михан 13.05.2015 13:54
Прикольною) Зато на Java можно какой хочешь графический интерфейс сделать самостоятельно с приемом и передачей данных
Цитировать
 
 
#8 Игорь 13.05.2015 14:04
Если бы я знал как то сделал бы)) я в этом деле тупой как воробушек)) хотя и перечитал много инфы . но толком ничего не понял) да и если честно там выше автор давал ссылку на JDK и NetBeanse я даже этого толком не понял) скачать скачал но почем уто начало кидать ошибки непонятные для меня , так и не срослось)
Цитировать
 
 
#9 Влад 19.04.2017 15:50
Когда выполняю в netbeanse, выдаёт:
Could not find COM port.
Ардуину настроил, не пойму в чём дело. помогите пожалуйста
Цитировать
 
 
#10 greyfantom 14.08.2018 20:45
Если ошибка по com порту значит измени на свой порт посмотри в диспетчере устройств на каком порту у тебя весит ардуинка
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Последние комментарии

Последнии темы форума

  • Нет сообщений для показа