Мигаем встроенным светодиодом с частотой, определяемой компьютером.
- Войдите на сайт для отправки комментариев
Чт, 25/10/2012 - 10:49
Приветствую сообщество любителей и профессионалов!
Буквально на днях приехала ко мне из Китая ардуина нано. Так как пока не определился в какой проект её засунуть (столько всего сделать хочется, аж жуть), просто решил помигать светодиодом. Собрал из нескольких примеров скетч, и написал в VS маленькую прогу на C# для управления портом.
Цель: Заставить мигать светодиод на микроконтроллере в зависимости от команд с ББ.
На МК есть интегрированный в плату светодиод на 13-й ноге. С ББ отправляется частота включения/отключения 13-го пина путём изменения положения ползунка (выбрано 5-ть значений, от 1 до 5).
/* Моргаем светодиодом Управление частотой моргания светодиода из интерфейса программы через COM-порт. Пример кода и программы размещён в свободном доступе: http://hoplik.ru */ // На 13 пине сидит светодиод в большинстве Arduino. const int ledPin = 13; // присваиваем имя int ledState = LOW; // состояние светодиода unsigned long lastMillis = 0; // время последнего моргания светодиода int blinkTime = 1000; // время моргания светодиода по умолчанию String inputString=""; // обнуляем строку // Установка запускается однократно, при нажатии reset: void setup() { // Устанавливает цифровой пин как выходной. pinMode(ledPin, OUTPUT); // инициализация порта: Serial.begin(9600); } /* SerialEvent выполняется при получении новых данных на порт serial RX. Эта часть выполняется перед каждым периодом выполнения loop(). Задержка в секции LOOP () даёт задержку при чтении порта. */ void serialEvent() { inputString = ""; while (Serial.available()) { // получен новый байт: char inChar = (char)Serial.read(); // добавили знак к строке inputString: inputString += inChar; } // устанавливаем новую частоту мигания при получении данных с порта switch (inputString.toInt()){ case 1: blinkTime = 1000; break; case 2: blinkTime = 700; break; case 3: blinkTime = 500; break; case 4: blinkTime = 300; break; case 5: blinkTime = 100; break; } Serial.print(inputString.toInt()); // вернули в порт полученное значение (для контроля) } // Операция loop выполняется постоянно, по кругу. void loop() { unsigned long curMillis = millis(); // присваиваем переменной текущее время работы программы // проверяем не прошёл ли наш интервал if (curMillis - lastMillis > blinkTime){ lastMillis = curMillis; //сохраняем время последнего переключения светодиода // если светодиод не горит, включаем и наоборот if (ledState == LOW) ledState = HIGH; else ledState = LOW; digitalWrite(ledPin, ledState); // включаем или выключаем светодиод } }
Базовый код формы для ББ (написан на С# для платформы Windows CE .NET CF 2.0):
using System;
using System.Windows.Forms;
namespace Blink
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent(); // Инициализация компонентов
string[] ports = System.IO.Ports.SerialPort.GetPortNames();
foreach (string port in ports)
comboBox1.Items.Add(port); //Отображение доступных портов в комбобоксе
}
//При изменении ползунка записываем новые данные в порт
private void trackBar1_ValueChanged(object sender, EventArgs e)
{
string sendMess = trackBar1.Value.ToString() + "\r\n";
if (serialPort1.IsOpen == false)
textBox1.Text = "Необходимо выбрать порт";
else serialPort1.WriteLine(sendMess);
textBox1.Text = "Частота моргания - " + sendMess + textBox1.Text;
}
//При выборе СОМ-порта назначаем его и открываем
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
try//Ловим ошибки работы с портом
{
serialPort1.Close();
serialPort1.PortName = comboBox1.Text.ToString();
serialPort1.Open();
}
catch { }
}
}
}
Несмотря на то, что вопрос приема чисел из ком-порта поднималась уже стопитсот раз, пост считаю полезным, ибо сразу в одно место сложены и котлеты и мухи... сорри, и ардуино скетч и программа на VB
Несмотря на то, что вопрос приема чисел из ком-порта поднималась уже стопитсот раз, пост считаю полезным, ибо сразу в одно место сложены и котлеты и мухи... сорри, и ардуино скетч и программа на VB
Спасибо. Я ещё не все темы успел прочитать. Из того, что заметил, когда пробовал разные варианты скетча, если не в стринг, а в чар загонять данные из порта, то памяти в два раза меньше отъедает. Но решил уже не переписывать правильно, оставив возможность развиваться. :)
были танцы с бубном пока просто так посылал с компа в порт.
потом перед посыланием дописал установку скорости, четности и чего-то еще, тогда начало работать.
кстати, а где вопрос?
Наверно, стоит рассматривать этот топик как ответ на ещё не заданный вопрос ;)
Просто поэкспериментировал и вывалил в общий доступ, в надежде, что у кого-то может не хватить знаний, терпения, времени заниматься тем же. Посмотрят, используют для чего-нибудь или модернизируют с точки зрения оптимизации кода.