Hatred's Log Place

DON'T PANIC!

Sep 14, 2009 - 4 minute read - linux

Первые игры с Arduino

Купил давно, да вот только руки дошли.

Под Arch Linux начать работать с ардуино проще простого:

  • собрать из AUR пакет arduino, который представляет собой среду разработки с одноименным названием, и который предложит поставить все необходимые зависимости в системе.
  • добавить пользователя в группу uucp, или какая назначается на устройства типа /dev/ttyUSB0

Ну вот собственно и все, дальше уже фантазия.

Для начала сделал первые пример с мигающим светодиодом. Радости не было предела :) потом написал генератор азбуки морзе, и этот светодиод начал вымигивать год моего рождения, вот код:

// Номер вывода, по которому работаем
const int pin = 13;

// фраза, которую нужно произнести
//char *txt = "hello world";
char *txt = "08 01 1984";
//char *txt = "a a aa aa";

#define dot          (100)
#define tire         ((dot)*3)
#define letter_space ((dot)*3 - (dot))
#define word_space   ((dot)*7 - (letter_space))

char *get_code(char letter)
{
  char *code = NULL;
  
  switch(letter)
  {
    case 'a': code = ".-"; break;
    case 'b': code = "-..."; break;
    case 'c': code = "-.-."; break;
    case 'd': code = "-.."; break;
    case 'e': code = "."; break;
    case 'f': code = "..-."; break;
    case 'g': code = "--."; break;
    case 'h': code = "...."; break;
    case 'i': code = ".."; break;
    case 'j': code = ".---"; break;
    case 'k': code = "-.-"; break;
    case 'l': code = ".-.."; break;
    case 'm': code = "--"; break;
    case 'n': code = "-."; break;
    case 'o': code = "---"; break;
    case 'p': code = ".--."; break;
    case 'q': code = "--.-"; break;
    case 'r': code = ".-."; break;
    case 's': code = "..."; break;
    case 't': code = "-"; break;
    case 'u': code = "..-"; break;
    case 'v': code = "...-"; break;
    case 'w': code = ".--"; break;
    case 'x': code = "-..-"; break;
    case 'y': code = "-.--"; break;
    case 'z': code = "--.."; break;
    
    case '1': code = ".----"; break;
    case '2': code = "..---"; break;
    case '3': code = "...--"; break;
    case '4': code = "....-"; break;
    case '5': code = "....."; break;
    case '6': code = "-...."; break;
    case '7': code = "--..."; break;
    case '8': code = "---.."; break;
    case '9': code = "----."; break;
    case '0': code = "-----"; break;
  }
  
  return code;
}

void beep(char on_off)
{
  if(on_off)
  {
    digitalWrite(pin, HIGH);
  }
  else
  {
    digitalWrite(pin, LOW);
  }
}

void setup()
{
  pinMode(pin, OUTPUT);
}

void loop()
{
  char  ch;
  char *tmp = txt;
  char *code;
  char  sign;
  
  for(ch = *tmp; ch != '<br/>0'; ch = *(++tmp))
  {
    // пауза между словами
    if(ch == ' ')
    {
      delay(word_space);
      continue;
    }
    
    code = get_code(ch);
    if(code != NULL)
    {
      for(sign = *code; sign != '<br/>0'; sign = *(++code))
      {
        beep(1);
        switch(sign)
        {
          case '.': delay(dot);  break; // звучит точка
          case '-': delay(tire); break; // звучти тире
        }
        beep(0);
        delay(dot); // пауза между элементами одного знака
      }
     
      delay(letter_space); // пауза после знака
    }
  }
  
  delay(word_space*4); // пауза до следующей итерации
}

#define вместе const .. позволили несколько уменьшить объем кода. Да, это далеко не оптимальный вариант, но главное что работае.

Далее решил это озвучить, можно сделать тон и генарацией прямоугольных импульсов, на одном цифровом выходе и выдачей управления на другом, но решил пока не усложнять программу, а вспомнить пайку :)

Пока консруктивно получилась такая страшная штука:

Вот такая страхообразиа :)

Схему и более-менее финальную (потому что сделаю без разводки, на небольшой макетке) кострукцию покажу в последующих постах, как и описание подробное :)

А краткое описание такое: на макетке собран генератор прямоугольных импульсов на двух транзисторах (КТ315 и КТ361), сигнал подается на капсуль низкоомного головного телефона (ТА-56М, 50 Ом), питание подается с разъема 5V платы Arduino через ключ на биполярном транзисторе КТ315, управляющий сигнал подается на ключ (базу транзитора) с цифрового выхода 13 платы Arduino. Запитывал плату от USB, питания хватало и на генератор.

На текущий момент практическая польза от устройства стремиться к нулю, но как вариант, доделывается взаимодействие с PC через USB для загрузки коротких текстов и автоматического проигрывания, сиречь - для изучения азбуки морзе :) Собственно идея на это и направлена :)