G37K0

    стоит береза во поле
    реликтовые зайцы прыгают в траве
    плодя фантазии в моей голове..

    Контора Кука, Береза во поле, Рио, 2015, 1:13

Одна сторона светофора
----------------------

  +->-+
  |   v
  |  001 (1)
  |  |||
  |  || -- зажечь   красный
  |  | --- погасить желтый
  |   ---- погасить зеленый
  |   v
  |  задержка одна секунда
  |   v
  |  010 (2)
  |  |||
  |  || -- погасить красный
  |  | --- зажечь   желтый
  |   ---- погасить зеленый
  |   v
  |  задержка одна секунда
  |   v
  |  100 (4)
  |  |||
  |  || -- погасить красный 
  |  | --- погасить желтый  
  |   ---- зажечь   зеленый 
  |   v
  |  задержка одна секунда
  |   v
  |  010 (2)
  |  |||
  |  || -- погасить красный
  |  | --- зажечь   желтый
  |   ---- погасить зеленый
  |   v
  |  задержка одна секунда
  |   |
  +-<-+

Замечаем, как меняется слово состояния автомата (PSW -- program status word):

  2**0, 2**1, 2**2, 2**1, 2**0 .. называется параболическая пила.

Лампу нужного цвета стоит включить, если соответствующий разряд нашего трехбитового слова равен единице, и выключить, если нулю.

Paссматривая "Raptor Reference", придумаем такие математические (math.h в C++) функции, что

  RED:    f(1)=1 f(2)=0 f(4)=0
  YELLOW: f(1)=0 f(2)=1 f(4)=0
  GREEN:  f(1)=0 f(2)=0 f(4)=1

Мне пришло в голову такое решение:

                      x = 1
                     dx = 2
                        |
  +---------->----------+
  |                     |      
  |               pin 13: (x%2)
  |               pin 12: (2-x%2-ceiling(x/2))  # ceil(x/2) в C++
  |               pin 11: (ceiling(x/2)-1)
  |                     |
  ^               delay one second
  |                     |
  |      - yes -<- [ x > 2 ? ] ->- no -
  |     |                              |
  | [ dx = 1 / 2 ]                     |
  |     |                              |
  ^      ---------------+--------------
  |                     |
  |      - yes -<- [ x < 2 ? ] ->- no -
  |     |                              |
  | [ dx = 2 ]                         |
  |     |                              |
  ^      ---------------+--------------
  |                     |
  |               [ x = x * dx ]
  |                     |
  +----------<----------+

Осталось воплотить алгоритм на Рапторе, сгенерировать код С++, и подправить его под UnoArduSim (что пойдет в setup, что пойдет в loop, переправить cout'ы в digitalWrite, a playsound'ы в delay..)

  