Вы когда нибудь хотели управлять различными приборами при помощи компьютера? Или разработать свой собственный USB гаджет? Лично я - да. Именно это желание заставило меня начать увлекаться микроконтроллерами и изобретать всякие электронные штуки. В данном примере будем управлять сервомашинкой 9g. При помощи приложения на языке программирования java. Про то как управлять сервоприводом было кратко сказано ранее. Будем использовать среду разработки NetBeanse 7.1 IDE. Конечно можно использовать язык processing где уже есть готовые библиотеки для обмена данными. Но сам этот язык сделан на java что накладывает на этот язык определенные рамки. Насколько я понимаю processing это средство визуализации данных. В то время как java это мощный инструмент программирования.
Схема подключения довольно проста, которая состоит из платы Arduino(в моем примере это Arduino Mega2560) и сервопривода. Сервомашинка имеет три вывода, два это питание и один это управляющий вывод. Куда подключать выводы питания говорить не буду - и так все понятно , а вот линию данных нужно подсоединить к тому выводу Arduino к которому привязан сервопривод - настройка осуществляется в программе. Управление сервоприводом происходит путем изменения длины импульса поступающего на вход линии данных. Для этого в среде Arduino существует специальная библиотека Servo. Которая имеет ряд простых методов и которая позволит с легкостью позиционировать сервопривод.
Последню версию JDK и NetBeanse можно скачать с официального сайта java. Все бесплатно и общедоступно.
Далее нам необходимо скачать библиотеку RXTX которая позволит нам обмениваться с внешними устройствами по UART интерфейсу. Скачать библиотеку RXTX можно здесь. С ее помощью можно как передавать данные так и принимать их. Выбираем нужную версию под 32 или 64 ОС.
У меня на компьютере был установлен XP. Под 64 битную ОС тоже должно все заработать.
В этой библиотеке 3 файла.
Их нужно скопировать в папку с установленным jdk,
RXTXcomm.jar скопировать в \jre\lib\ext (under java),
rxtxSerial.dll и rxtxParallel.dll скопировать в \jre\bin.
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.
#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 выводу.
Комментарии
Единственное - в коде ардуино первые строки заменил на:
#include
Servo myservo;
Иначе не компилировалось )
Я с джава не заморачивался нашел готовую прогу с похожим смыслом http://alex-exe.ru/programm/program-control-4serva-com/ , изменил последнюю строчку из кода ардуины pos = map(bytev,0,127 ,0,180); на pos = map(bytev,0,60, 0,180); , и пользуюсь 1 бегунком програмки))
Could not find COM port.
Ардуину настроил, не пойму в чём дело. помогите пожалуйста