201403111900


Задачи с Брдуино
----------------

    "Скажите, у Вас все шутки такие плоские?"

    3D-шутка.


Задача 1. Мигающая лампа
------------------------

Описание схемы: Breadboard.java
-------------------------------

Лампа подключена к контакту D0 платы Arduino.

  import greenfoot.*;

  public class Breadboard extends HiddenWorld
  {
      public Breadboard()
      {
          super();

          addObject( new Bulb( 0), 122, 122);
          addObject( new Arduino(), 700, 400);
      }
  }


Программа микроконтроллера: Arduino.java
----------------------------------------

  import greenfoot.*;

  public class Arduino extends Detector
  {
      public void setup() {
      }

      public void loop() {
          digitalWrite( 0, 1);
          waitms( 1000);
          digitalWrite( 0, 0);
          waitms( 1000);
      }
  }

========================================================================

Задача 2. Семисегментный индикатор
----------------------------------

Описание схемы: Breadboard.java
-------------------------------

Индикатор подключен к контактам Arduino D6..D0, семь кнопок к контактам Arduino D13-D7.

  import greenfoot.*;

  public class Breadboard extends HiddenWorld
  {
      public Breadboard()
      {
          super();

          addObject( new Button( 7), 293, 337);
          addObject( new Button( 8), 427, 406);
          addObject( new Button( 9), 404, 531);
          addObject( new Button(10), 256, 609);
          addObject( new Button(11), 126, 535);
          addObject( new Button(12), 153, 409);
          addObject( new Button(13), 276, 469);

          addObject( new Big7(),  75, 130);

          addObject( new Arduino(), 1000, 570);
      }
  }

Схема представлена исходным кодом на языке программирования Java, где функция трех переменных помещает новый элемент b (Button-кнопка, Bulb, Big7, LCD16x2, Arduino)

  addObject( b, x, y)

в точку с координатами x, y. Размеры макетной платы заданы в строке super(1200, 700, 1), что означает 1200 х 700 квадратов 1 x 1. (Другой пример -- super(7, 5, 150), доска 7 х 5 квадратами по 150 х 150).

  new Button( 7) -- новая кнопка подключенная к контакту D7.
  new Bulb( 13)  -- новая лампа подключенная к контакту D13.
  new Big7()     -- новый семисегментный индикатор.
  new LCD16x2    -- новый двухстрочный дисплей (16 символов в строке)

  new Arduino()  -- добавляем плату микроконтроллера (Arduino Uno).

Другие замечания.

  1. // В начале строки означает, что это комментарий. Такие строки машина не читает, они предназначены для человека, знакомящегося с текстом программы.

  2. Каждое программное предложение заканчивается точкой с запятой ; Что считать  предложением по началу смотрим по аналогии с уже написанными фрагментами.


Программа микроконтроллера: Arduino.java
----------------------------------------

  import greenfoot.*;

  public class Arduino extends Detector
  {
      public void setup() {
      }

      public void loop() {
          digitalWrite( 0, digitalRead( 7));
          digitalWrite( 1, digitalRead( 8));
          digitalWrite( 2, digitalRead( 9));
          digitalWrite( 3, digitalRead(10));
          digitalWrite( 4, digitalRead(11));
          digitalWrite( 5, digitalRead(12));
          digitalWrite( 6, digitalRead(13));
      }
  }

========================================================================

Задача 3. LCD дисплей
---------------------

Описание схемы: Breadboard.java
-------------------------------

  import greenfoot.*;

  public class Breadboard extends HiddenWorld
  {
      public Breadboard()
      {
          super();

          addObject( new LCD16x2(), 444, 333);
          addObject( new Arduino(), 1000, 570);
      }
  }

Программа микроконтроллера: Arduino.java
----------------------------------------

  import greenfoot.*;

  public class Arduino extends Detector
  {
      public void setup() {
      }

      public void loop() {
          lcd.Print("SEVEN EIGHT NINE(seven ate nine)");
      }
  }

После запуска зеленой кнопкой run на экран будет выведено

    +------------------+
    | SEVEN EIGHT NINE |
    | (seven ate nine) |
    +------------------+

========================================================================

Задача 4.  Две лампы управляются одной кнопкой
----------------------------------------------

Описание схемы: Breadboard.java
-------------------------------

  import greenfoot.*;

  public class Breadboard extends HiddenWorld
  {
      public Breadboard()
      {
          super();

          addObject( new Bulb( 0),  100, 100);
          addObject( new Bulb( 1),  200, 100);
          addObject( new Button(7), 400, 100);

          addObject( new Arduino(), 1000, 570);
      }
  }


Программа микроконтроллера: Arduino.java
----------------------------------------

  import greenfoot.*;

  public class Arduino extends Detector
  {
      public void setup() {
      }

      public void loop() {
          int x = digitalRead( 7);
          digitalWrite( 0, x);
          digitalWrite( 1, x);
      }
  }

========================================================================

Задача 5. Кнопка управляет Лампой 1. Лампа 0 мигает с интервалом в 1 сек
------------------------------------------------------------------------

Очевидно, что описание схемы остается таким же как в задаче "Две лампы управляются одной кнопкой". Программа микроконтроллера может выглядеть так:

  import greenfoot.*;

  public class Arduino extends Detector
  {
      public void setup() {
      }

      public void loop() {
          digitalWrite( 1, digitalRead( 7));
          digitalWrite( 0, 1);
          waitms( 1000);
          digitalWrite( 0, 0);
          waitms( 1000);
      }
  }

Однако кнопка не чувствительна (залипает) до двух секунд, пока мы вновь не вернемся в начало функции loop(). Избежать неудобство можно, если мы покинем функцию loop, если задержка меньше заданной (1000 msec), либо изменим состояние лампы 0, если задержка достигнута. Для этой цели написана функция ispausereached( long ms), а вся программа контроллера будет выглядеть, например так:

  import greenfoot.*;

  public class Arduino extends Detector
  {
      int  x;

      public void setup() {
          x = 0;
      }

      public void loop() {
          digitalWrite( 1, digitalRead( 7));
          if (1 == ispausereached( 1000))
              x = (x == 0) ? 1 : 0;
          digitalWrite( 0, x);
      }
  }

========================================================================

Задача 6. Счетчик: на индикаторе с интервалом в 1 секунду
          последовательно загораются цифры: 0, 1, 0..
---------------------------------------------------------

Описание схемы: Breadboard.java
-------------------------------

  import greenfoot.*;

  public class Breadboard extends HiddenWorld
  {
      public Breadboard()
      {
          super();

          addObject( new Big7(),  75, 130);
          addObject( new Arduino(), 1000, 570);
      }
  }

Программа микроконтроллера: Arduino.java
----------------------------------------

  import greenfoot.*;

  public class Arduino extends Detector
  {
      public void setup() {
      }

      public void loop() {
          digitalWrite( 0, 1);
          digitalWrite( 1, 1);
          digitalWrite( 2, 1);
          digitalWrite( 3, 1);
          digitalWrite( 4, 1);
          digitalWrite( 5, 1);
          waitms(1000);
          digitalWrite( 0, 0);
          digitalWrite( 3, 0);
          digitalWrite( 4, 0);
          digitalWrite( 5, 0);
          waitms(1000);
      }
  }

========================================================================

Задача 7. Аналоговый измерительный прибор
-----------------------------------------

Описание схемы: Breadboard.java
-------------------------------

  import greenfoot.*;

  public class Breadboard extends HiddenWorld
  {
      public Breadboard()
      {
          super();
          addObject( new Button(0),  75, 130);
          addObject( new Button(1),  175, 130);
          addObject( new Button(2),  275, 130);
          addObject( new Button(3),  375, 130);
          addObject( new Meter(0),  600, 130);
          addObject( new Arduino(), 1000, 570);
      }
  }

Программа микроконтроллера: Arduino.java
----------------------------------------

  import greenfoot.*;

  public class Arduino extends Detector
  {
      public void setup() {
          setButtonMode( RADIO);
      }

      public void loop() {
          int value = 0;

          if (digitalRead(0) > 0) value = 60;
          if (digitalRead(1) > 0) value = 130;
          if (digitalRead(2) > 0) value = 200;
          if (digitalRead(3) > 0) value = 270;
          analogWrite( 0, value);
      }
  }

========================================================================

Задача 8. Осциллографъ
----------------------

Описание схемы: Breadboard.java
-------------------------------

  import greenfoot.*;

  public class Breadboard extends HiddenWorld
  {
      public Breadboard()
      {
          super();
          addObject( new Oscilloscope(1),  300, 420);
          addObject( new Arduino(), 1000, 570);
      }
  }

Программа микроконтроллера: Arduino.java
----------------------------------------

  import greenfoot.*;

  public class Arduino extends Detector
  {
      int OSCSCRWIDTH = 270;
      int x = 0;

      int scaledSin( int aDegrees) {
          return (int) (300. * Math.sin(
              aDegrees * Math.PI / 180 * 360/OSCSCRWIDTH ));
      }

      public void loop() {
          analogWrite( 1, scaledSin( x));
          x = (x < OSCSCRWIDTH) ? ++x : 0;
      }
  }

========================================================================

Задача 9. Cхема коридорного освещения на 8 проходов
----------------------------------------------------

Описание схемы: Breadboard.java
-------------------------------

  import greenfoot.*;

  public class Breadboard extends HiddenWorld
  {
      public Breadboard()
      {
          super();

          addObject( new Button( 0), 100, 100);
          addObject( new Button( 1), 300, 100);
          addObject( new Button( 2), 500, 100);
          addObject( new Button( 3), 500, 300);
          addObject( new Button( 4), 500, 500);
          addObject( new Button( 5), 300, 500);
          addObject( new Button( 6), 100, 500);
          addObject( new Button( 7), 100, 300);

          addObject( new Bulb(13),  300, 300);

          addObject( new Arduino(), 1000, 570);
      }
  }

Программа микроконтроллера: Arduino.java
----------------------------------------

  import greenfoot.*;

  public class Arduino extends Detector
  {
      int ostate = 0;
      int light  = 0;

      public void setup() {
          setButtonMode( STANDALONE);
      }

      public void loop() {
          int cstate = 0;
          for (int i = 0; i < 8; i++)
              cstate += (1 << i) * digitalRead(i);
          if (cstate != ostate) {
              digitalWrite(13, light = (light == 0) ? 1 : 0);
              ostate = cstate;
          }
      }
  }

========================================================================

Задача 10. Введение в прерывания. Коридор на кнопках без блокировки
-------------------------------------------------------------------

Описание схемы: Breadboard.java
-------------------------------

  import greenfoot.*;

  public class Breadboard extends HiddenWorld
  {
      Bulb Z = new Bulb(13);

      public Breadboard()
      {
          super();

          addObject( new Button( 0), 100, 100);
          addObject( new Button( 1), 300, 100);
          addObject( new Button( 2), 500, 100);
          addObject( new Button( 3), 500, 300);
          addObject( new Button( 4), 500, 500);
          addObject( new Button( 5), 300, 500);
          addObject( new Button( 6), 100, 500);
          addObject( new Button( 7), 100, 300);

          addObject( Z, 300, 300);

          addObject( new Arduino(), 1000, 570);
      }

      public void InterruptedBy(int aPin) {
          if (Z.getState() == 0) Z.On(); else Z.Off();
      }
  }

Программа микроконтроллера: Arduino.java
----------------------------------------

  import greenfoot.*;

  public class Arduino extends Detector
  {
      public void setup() {
          setButtonMode( MOMENTARY);
      }

      public void loop() {
          // Breadboard is responsible for Interrupts
      }
  }

========================================================================

Задача 11. TestBed::Гексаподы
-----------------------------

Движение вправо.

   o  o  o    |  o  |      /o    /    oo    o    o|    o  o  |  o
   |  |  |    |  |  |     / |   /    / |   /    / |   /   |  |  |
   =======>   =======>   =======>   =======>   =======>   =======>
   |  |  |    |  |  |    |   \ |    |   \ |    |   \ |    |  |  |
   o  o  o    o  |  o    o    \o    o    oo    |    o|    |  o  |

   a)         b)         c)         d)         e) -move-> f)

   o    /o    o    oo    |    o|
   |   / |    |   / |    |   / |
   =======>   =======>   =======>       ...
    \ |   \    \ |   \    \ |   \
     \o    \    oo    o    o|    o

   g)         h)         i) -move-> b)  ...

   abcdefghibcdefghib..

Движение влево.

   o  o  o    |  o  |  \    o\    o    oo    o    |o      o  |  o
   |  |  |    |  |  |   \   | \    \   | \    \   | \     |  |  |
  <=======   <=======   <=======   <=======   <=======    =======
   |  |  |    |  |  |    | /   |    | /   |    | /   |    |  |  |
   o  o  o    o  |  o    o/    o    oo    o    |o    |    |  o  |

   a)         b)         c)         d)         e) <-move- f)

   o\    o    oo    o    |o    |
   | \   |    | \   |    | \   |
   =======    =======    =======        ...
  /   | /    /   | /    /   | /
 /    o/    o    oo    o    |o

   g)         h)         i) <-move- b)  ...

   abcdefghibcdefghib..

Описание схемы: Breadboard.java
-------------------------------

  import greenfoot.*;

  public class Breadboard extends HiddenWorld
  {
      public Breadboard()
      {
          super();

          addObject( new Hexapod(),  150, 150);
          addObject( new Hexapod(),  150, 420);
          addObject( new Arduino(), 1000, 570);
      }
  }

Программа микроконтроллера: Arduino.java
----------------------------------------

  import greenfoot.*;

  public class Arduino extends Detector
  {
      public void setup() {
      }

      public void loop() {
      }
  }

========================================================================

Задача 12. TestBed::Ворота на край света
----------------------------------------

Описание схемы: TestBead.java
-------------------------------

  import greenfoot.*;

  public class TestBed extends HiddenWorld
  {
      public TestBed()
      {
          super();

          addObject( new Button(1), 550, 120);
          addObject( new Button(2), 650, 120);
          addObject( new Button(3), 750, 120);
          addObject( new Button(4), 550, 200);
          addObject( new Button(5), 650, 200);
          addObject( new Button(6), 750, 200);
          addObject( new Button(7), 550, 280);
          addObject( new Button(8), 650, 280);
          addObject( new Button(9), 750, 280);
          addObject( new Button(0), 650, 360);

          addObject( new Gate(), 240, 340);
          addObject( new Arduino(), 650, 550);
      }
  }

Работа двери (черновик)
-----------------------

  import greenfoot.*;
  import java.awt.Color;
  import java.util.List;

  public class HiddenWorld extends World
  {
      public static final int STANDALONE = 0;
      public static final int RADIO      = 1;
      public static final int MOMENTARY  = 2;

      int ButtonMode = STANDALONE;
      int momentaryState = 0;
      int p = 0;

      private void openGate() {
          List<Gate> vlg = getObjects(Gate.class);
          if (vlg.size() > 0) vlg.get(0).Open();
      }

      private void drawOnTheWall() {
          GreenfootImage i = getBackground();
          i.setColor( Color.BLACK);
          i.fillRect(195, 17, 50, 20);
          i.setColor( Color.WHITE);
          i.drawString( ": " + momentaryState, 200, 30);
      }

      public void ButtonOn(int aPin) {
          momentaryState = momentaryState * 10 + aPin;
          p++;
          if (p > 3) {
              p = 0;
              openGate();
              drawOnTheWall();
              momentaryState = 0;
          }
      }

      public void setButtonMode( int aMode) {
          ButtonMode = aMode;
      }

      public int getButtonMode() {
          return ButtonMode;
      }

      public HiddenWorld()
      {
          super(1200, 700, 1);
      }
  }
