Перемещение вала привода в полученное положение
inputString = "";
stringComplete = false;
}
}
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
inputString += inChar;
if (inChar == '\n') {
stringComplete = true;
}
}
}
Отладку скетча можно выполнить при помощи встроенного монитора последовательного порта (рис. 1).
Рис. 1 – Вызов окна монитора последовательного порта
Приложение на C# должно иметь одну форму со следующим интерфейсом (рис. 2).
Рис. 2 – Интерфейс управляющего приложения
Используемые элементы, а также их свойства приведены в табл. 1
Табл. 1 Свойства элементов интерфейса управляющего приложения
Элемент | Свойство | Значение |
Label | Name | currentPosition |
Text | ||
TrackBar | Name | servoPosition |
Maximum | ||
Minimum | ||
SmallChange | ||
Button | Text | Установить |
Код единственной формы приложения может быть разработан по следующему шаблону:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace WindowsFormsApplication9
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
serialPort1 = new SerialPort { PortName = "COM5", BaudRate = 9600 };
}
private void servoPosition_Scroll(object sender, EventArgs e)
{
/*текст метки*/ = servoPosition.Value.ToString();
//sendToArduino(/*последовательный порт*/, /*угол поворота*/);
}
private void sendToArduino(SerialPort sp, int data)
{
/*последовательный порт*/.Open();
/*последовательный порт*/.WriteLine(data.ToString());
???? //освобождение занятого ресурса ОС
}
private void button1_Click(object sender, EventArgs e)
{
sendToArduino(serialPort1, servoPosition.Value);
}
}
}
К п.4 Трёхцветный светодиод или RGB-светодиод — это совмещённые в одном корпусе светодиоды красного, зелёного и синего цветов. Светодиод имеет 4 вывода. 3 вывода — аноды, соответствующие отдельным цветам и одна — общий катод. Подавая сигнал на один из анодов, можно добиться свечения одним из цветов. Используя широтно-импульсную модуляцию (PWM-сигнал) для всех анодов одновременно, можно получить свечение произвольным цветом.
Скетч, выполняющий заданные функции может быть реализован по следующему шаблону
int r1 = 2;
int b1 = 3;
int g1 = 4;
int r2 = 8;
int g2 = 9;
int b2 = 10;
String inputString = "";
boolean stringComplete = false;
void setup()
{
pinMode(r1,OUTPUT);
pinMode(g1,OUTPUT);
pinMode(b1,OUTPUT);
pinMode(r2,OUTPUT);
pinMode(g2,OUTPUT);
pinMode(b2,OUTPUT);
digitalWrite(r1,HIGH);
digitalWrite(g1,LOW);
digitalWrite(b1,LOW);
digitalWrite(r2,LOW);
digitalWrite(g2,LOW);
digitalWrite(b2,HIGH);
Serial.begin(9600);
}
void loop()
{
if (stringComplete) {
if(digitalRead(r1)==HIGH)
{
//светодиод1 – синий
//светодиод2 – красный
} else
{
//светодиод1 – красный
//светодиод2 – синий
}
inputString = "";
stringComplete = false;
}
}
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
inputString += inChar;
if (inChar == '\n') {
stringComplete = true;
}
}
}
Управляющее приложение может быть реализовано за счет усовершенствования приложения из лабораторной работы №1. В указанном приложении необходимо создать экземпляр класса SerialPort, а также осуществлять передачу произвольной строки по последовательному интерфейсу при нажатии на одну из кнопок.
К п. 5 В данном случае необходима разработка протокола обмена информацией между Arduino и управляющим приложением. Указанный протокол может быть реализован благодаря отправке управляющим приложением сообщений длиной 6 байт, содержащих символы ‘0’ или ‘1’, кодирующие состояние того или иного анода светодиодов. Скетч, реализующий данный протокол реализуется по следующему шаблону:
int r1 = 2;
int b1 = 3;
int g1 = 4;
int r2 = 8;
int g2 = 9;
int b2 = 10;
int led_pos = 0;
String inputString = "";
boolean stringComplete = false;
void setup()
{
pinMode(r1,OUTPUT);
pinMode(g1,OUTPUT);
pinMode(b1,OUTPUT);
pinMode(r2,OUTPUT);
pinMode(g2,OUTPUT);
pinMode(b2,OUTPUT);
digitalWrite(r1,HIGH);
digitalWrite(g1,LOW);
digitalWrite(b1,LOW);
digitalWrite(r2,LOW);
digitalWrite(g2,LOW);
digitalWrite(b2,HIGH);
Serial.begin(9600);
}
void loop()
{
if (stringComplete) {
inputString = "";
stringComplete = false;
}
}
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
switch(led_pos)
{
case 0:
digitalWrite(r1,LOW);
digitalWrite(g1,LOW);
digitalWrite(b1,LOW);
digitalWrite(r2,LOW);
digitalWrite(g2,LOW);
digitalWrite(b2,LOW);
if(inChar=='1'){
Светодиод 1 - красный
}else{
Светодиод 1 - не красный
}
break;
case 1:
if(inChar=='1'){
Светодиод 1 - зеленый
}else{
Светодиод 1 – не зеленый
}
break;
case 2:
if(inChar=='1'){
Светодиод 1 - синий
}else{
Светодиод 1 – не синий
}
break;
case 3:
if(inChar=='1'){
Светодиод 2 - красный
}else{
Светодиод 2 – не красный
}
break;
case 4:
if(inChar=='1'){
Светодиод 2 - зеленый
}else{
Светодиод 2 – не зеленый
}
break;
case 5:
if(inChar=='1'){
Светодиод 2 - синий
}else{
Светодиод 2 – не синий
}
break;
}