201402120830


О программировании для Arduino
------------------------------

    "The Matrix has you...
    Follow the white rabbit."
    (перевод: поищи рабочий конвертер из HTML в UTF-8 текст на Java)
    
Начинавшаяся игра между компьютером HAL2023 и человеком не предвещала ничего утешительного -- HAL был чертовски умен, а по условиям поединка "мозг" проигравшей стороны должен был быть уничтожен прямым попаданием из 122-х миллиметровой гаубицы в момент объявления мата. 

  -- Я играю белыми -- сказал человек, и пошел e2-e4.
 
Задумавшись на пару минут, HAL объявил своим противным неэмоционально-вкрадчивым баритоном синтезатора:

  -- Вам мат в 82 хода.
  
Партия проиграна, но игра не окончена, подумал я, до объявления мата есть законные три часа (по заранее оговоренным условиям этого турнира), за это время многое может случиться (не на доске, конечно).


1. Virtual BreadBoard
---------------------

    "грузите апельсины бочках братья карамазовы"

Java -- сложный язык, поэтому возьмем трех помощников (дурак по прозвищу Шаблон и два зомби Дрыг и Дрып). Такой подход удобно изучить на примере программы VirtualBreadboard (см. клип [1]). Познакомиться с готовыми проектами или поделиться своей разработкой можно, например, на сайте [2].

При просмотре видео включим режим "Transcipt", добавим свои комментарии.

Start with empty project (Empty project template, OK).

  Add breadboard
  and Arduino (Uno)
  add a resistor, 
  turn it around a little bit - (->/|\, third tool from left on toolbar)
  on PIN 13
  an LED,                                                                ^    
  and wire it up (connect stright pin to GND on arduino using wire tool / )
                                                                       v
Before we go further let's save a project, we call it "Blink". Now we saved the project, we add some source code for the Arduino to run.

  Solution 'Blink'
    Blink  (right click, Add Java Source Project: Source0.SRC)
      Breadboard0.VBB
      Source0.SRC (right click, Add New Java Source File: Blink.java)


2. Скетчи
---------

    -- Ничего не боятся только дураки -- сказал Дрып.
    -- Это не правда! Вот я дурак, но я боюсь.. Вас -- ответил Шаблон кивнув назад -- Ничего не боятся только покойники.
    
Добавить (Add Java Source Project, Add New Java Source File: Blink.java).
Выбрать (щелкнуть редактор), построить исходный текст из шаблонов (templates).

<<
Шаблоны Arduino:

 (()()) Arduino
        import muvium.compatibility.arduino.*; 
        public class Blink extends Arduino {
          public void setup() {}
          public void loop() {}
        }
       
 [LCD]  New Liquid Crystal
          LiquidCrystal(rs, enable, d4, d5 d6, d7)
          
        import muvium.compatibility.arduino.LiquidCrystal;
        ...
        LiquidCrystal lcd = new LiquidCrystal(this, );
        
 [(.)]  New stepper
          Enter Motor Steps per revolution
            Stepper(STEPS,p1,p2,p3,p4)
          Enter Stepper Pins
            Stepper(steps,P1,P2,P3,P4)
            
        import muvium.compatibility.arduino.Stepper;
        ...
        Stepper stepper = new Stepper(this, 100, );

  (->   pinMode(13, OUTPUT);
  (*)   digitalWrite(13, HIGH);
  (L)   delay(500);
  ( )   digitalWrite(13, LOW);
  (?)   digitalRead( 13 );
 ((?))  analogRead( 13 );
 ((*))  analogWrite( 13 , 128 );
>>

Для мигалки потребуется следующий код:

  import muvium.compatibility.arduino.*; 

  public class Blink extends Arduino { 
    public void setup() {   
      pinMode(13, OUTPUT);
    }

    public void loop() {
      digitalWrite(13, HIGH);
      delay(500);
      digitalWrite(13, LOW);
      delay(500);
    }
  }

1 Error messages 2/12/2014 3:10:35 PM
(x) error 0: Arduino emulation runtime requires 'Arduino Toolkit' license.


3. Вторая ошибка сапера
-----------------------

    А деньги никто не отменял, это капитализм отменили.
    
    Шаблон

Слепо предположив, что VirtualBreadBoard бесплатна до тех пор, пока скетчи не надо конвертировать из Java в Аrduino (C), я с изумлением обнаружил, что это вовсе не так. Видимо забылось, что идти по GlassPath* босиком -- занятие не из приятных, впрочем цель себя оправдала -- оракул открыл код джавы от сан.

*) GNU Classpath

А пока мы разыскиваем завалявшиеся на дне кармана 19$ на покупку VBB Arduino Toolkit, сделаем небольшое отступление, и займемся Simuino. Загрузим в VirtualBox уже знакомую по курсу Unix машину Saucy (Ubuntu 13.10 x86), и свяжемся с ней через Putty (127.0.0.1:22).

  $ sudo apt-get install screen ncurses-dev
  $ wget -c http://simuino.googlecode.com/files/simuino-0-1-8.zip
  $ #       http://simuino.googlecode.com/files/simuino_v017.zip
  $ unzip simuino-0-1-8.zip
  $ cd simuino-0-1-8
  $ g++ simuino.c -o simuino -lncurses
  $ screen ./simuino
  
В момент загрузки скетча (команда load) обнаруживаем, что ядро 2.6, применяемое с целью сохранения способности загрузки VM при включенном Hyper-V в хосте Windows 8.x, не выдерживает симулятора Servduino и приводит к "Segmentation Fault". Машина, инсталлированная с ISO "Desktop x86 XUbuntu 12.04 rev.4", работает нормально. Повезло.


4. Java vs C
------------

    От чего больше пользы -- от табличек "ПО ГАЗОНАМ НЕ ХОДИТЬ. ВИДЕОЗАПИСЬ" или от пергаментных стен в японской хижине?

В C++ легко спрятать сложную часть проекта с помощью директивы include. Создадим простой язык программирования JAPL, и напишем на нем свой первый скетч с именем simple.japl.

simple.japl:

  "Just Another Programming Language"

complex.cpp:

  #include <iostream>

  using namespace std;

  int main(int argc, char* argv[]) {
    cout <<
    #include "simple.japl"
    << endl;
    return 0;
  }

Теперь, достаточно сказать

  $ g++ complex.cpp -o complex
  $ ./complex

Как получим ответ

  Just Another Programming Language

Скетч работает, весь язык состоит в двойных кавычках "до" и "после". Рассмотренная идея получила развитие в opensource симуляторе Arduino [3]. Загрузка нового скетча, однако, потребует наличия в системе установленного компилятора Orwell C++ [4] (по понятной причине).

Если писать скетчи на Java (VirtualBreadBoard), приходится мириться с наличием "лишнего" текста. Упрощение процесса программирования достигается за счет библиотеки готовых шаблонов (template) и коротких фрагментов кода (snippet) [5]. Выигрыш тут простой, образовательные проекты с открытым исходным кодом на Java настолько популярны, что не придется много писать самому (чем меньше неотлаженного кода, тем меньше багов (ошибок)).

Память микроконтроллера может быть использована различным способом:

  -- разбивается на Bootloader с интерпретатором (nanoVM java [6]), и хранилище байткодов.
  -- В момент загрузки в микроконтроллер, Java код конвертируется в C, а затем компилируется в машинные коды применяемого микроконтроллера.
  -- среда выполнения умещается в памяти устройства (Raspberry PI, Android+Dalvik/ART).
  -- эмулируется привычная runtime environment (Intel Galileo -- Arduino, Broadswell PLC -- C# [7]).


5. Когда текст сложнее картинки
-------------------------------

    -- С нас довольно. Бомбят, не бомбят -- домой мы идем.
    Они покинули укрытие, но уже через три минуты вернулись обратно.
    -- Я вижу, вы передумали, -- улыбнулся Мастер.
    -- Да, -- раздраженно ответили они, -- дождь там начался.
    
    Энтони де Мелло - Одна Минута Нонсенса
    
Часто в качестве актуатора (исполнительного устройства) микроконтроллера выступает компьютер (например, один из тех, на которых проходит обучение в компьютерных классах). Разработчики языка программирования Arduino учли это, добавив в язык объекты Keyboard и Mouse (USB, HID. Leonardo and Due only [8]). В этом случае скетч, загружаемый в Arduino -- лишь мизерная доля программной части проекта. Если Вы выбрали Java-VBB, для компьютерной части подойдyт Java/Greenfoot-3D [9]. Трехмерные модели "актеров" можно создавать в [10]. Возможно также управление Arduino c Android-телефона [11].


Ссылки
------

 [1]. http://www.youtube.com/watch?v=qvdvAef2hSg
 [2]. http://fritzing.org/home/
 [3]. https://github.com/Paulware/ArduinoSimulator
 [4]. http://sourceforge.net/projects/orwelldevcpp/
 [5]. http://www.virtualbreadboard.com/
 [6]. http://www.harbaum.org/till/nanovm/index.shtml
 [7]. http://infosys.beckhoff.com/italiano.php
     ?content=../content/1040/TcSample_NET/HTML/WebService_Sample_CS.htm&id=
 [8]. http://arduino.cc/en/Reference/HomePage
 [9]. http://www.metropy.net/greenfoot3d/
[10]. http://www.anim8or.com
[11]. http://www.waveraster.com/
[12]. http://www.nfcpood.ee/


