Анимированная картина "Ретро автомобиль"

Ваше мнение об этом проекте будет полезно его автору. Приглашаем Вас присоединиться к его обсуждению на форуме.
 
Анимированная картина "Ретро автомобиль"

Анимированная картина "Ретро автомобиль"


В этой работе мы заставили "ожить"изображение старого автомобиля на картине в рамке.
Вот как это выглядит:


По всем четырем сторонам рамки наклеены светодиодные полоски, имеющие напряжение питания 12 В.

retro2.JPG

Между собой эти полоски спаиваются параллельно проводами с обратной стороны рамки

retro6.JPG

и припаиваются к разъему питания для подключения сетевого адартера (любой сетевой адаптер с выходным напряжением 12 В, током не менее 0,3 А).

К выводам этого же разъема питания припаиваются провода питания платы микроконтроллера Arduino.
Использованная нами плата AT-Mini328

retro7.JPG

имеет диапазон напряжений питания 9 ... 30 В, что вполнен допускает ее питание тем же напряжением, что и у светодиодных полосок.

retro8.JPG

На данном этапе важно соблюдать правильную полярность источника питания при подключении как к светодиодам рамки, так и к плате Arduino.

Светодиодные полоски создают лишь общую подсветку картины, а вот световая сцена создается отдельными светодиодами, смонтированными в следующих местах картины:

- два светодиода установлены в фары автомобиля, включены параллельно
- по одному светодиоду встроены в боковые фонари машины (указатели поворота)
- по шесть светодиодов установлены на ободе переднего и заднего правых колес, при этом светодиоды, имеющие одинаковое расположение на переднем и заднем колесе соединены параллельно, что дает нам шесть пар светодиодов на колесах.

Мы выбради выводные 3 мм светодиоды белого света, поэтому монтировали их в отверстия диаметром 3 мм, просверленные в нужных местах картины

retro3.JPG

С обратной стороны они закреплены клеем при помощи термоклеевого пистолета. Монтаж проводов между светодиодами и платой Arduino - навесной.

retro4.JPG

retro5.JPG

И в сборе обратная сторона картины выглядит так:

retro9.JPG

Использование портов ввода/вывода платы Arduino:

Все используемые порты работают как порты вывода.

- Порт D0 - левый указатель поворота
- Порт D1 - правый указатель поворота

Колеса:

- Порт D2-D7 - светодиоды на ободах колес (D2 - верхний светодиод, все последующие - далее по часовой стрелке)

Фары:

Для фар мы решили применить плавное управление яркостью их свечения, поэтому мы их подключили к порту, имеющему функцию ШИМ регулятора (PWM). Для этого был выбран порт D10.

Вот код программы, загруженной в плату Arduino (его, конечно можно и нужно оптимизировать, но свою задачу он выполняет полностью):

/*
 
Retro
  Программа анимации картины со старым автомобилем
 */

int I = 0;

void setup() {              

  pinMode(13, OUTPUT);
 pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(10, OUTPUT);
//pinMode(11, OUTPUT);


digitalWrite(0, LOW);
digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
}

void loop() {


for (int i=0; i <= 255; i++){
analogWrite(10,i);
delay(5);
}

for (int i=255; i >= 0; i--){
analogWrite(10,i);
delay(5);
}
 
for (int i=0; i <= 255; i++){
analogWrite(10,i);
delay(5);
}

for (int i=255; i >= 0; i--){
analogWrite(10,i);
delay(5);
}

for (int i=0; i <= 255; i++){
analogWrite(10,i);
delay(5);
}

for (int i=255; i >= 0; i--){
analogWrite(10,i);
delay(5);
}

for (int i=0; i <= 255; i++){
analogWrite(10,i);
delay(5);
}
 
  delay(1000);            

   digitalWrite(0, HIGH);

  delay(500);            


   digitalWrite(0, LOW);

  delay(500);            

   digitalWrite(0, HIGH);

  delay(500);            


   digitalWrite(0, LOW);

  delay(500);            

   digitalWrite(0, HIGH);

  delay(500);            


   digitalWrite(0, LOW);

  delay(500);          

   digitalWrite(0, HIGH);

  delay(500);            
   digitalWrite(0, LOW);

  delay(500);            
 

   digitalWrite(0, HIGH);

  delay(500);           
   digitalWrite(0, LOW);

  delay(500);       
 

   digitalWrite(0, HIGH);

  delay(500);            


   digitalWrite(0, LOW);

  delay(500);           

   digitalWrite(1, HIGH);

  delay(500);            
   digitalWrite(1, LOW);

  delay(500);            
   digitalWrite(1, HIGH);

  delay(500);            
   digitalWrite(1, LOW);

  delay(500);            
   digitalWrite(1, HIGH);

  delay(500);            
   digitalWrite(1, LOW);

  delay(500);            
   digitalWrite(1, HIGH);

  delay(500);            
   digitalWrite(1, LOW);

  delay(500);            
   digitalWrite(1, HIGH);
  delay(500);            
   digitalWrite(1, LOW);
  delay(500);            
   digitalWrite(1, HIGH);
  delay(500);            
   digitalWrite(1, LOW);
  delay(500);            
   digitalWrite(2, LOW);
   digitalWrite(3, LOW);

  delay(1000);            

for (int i=1; i<=10; i++)
{
turn(100/i,10);
}

turn(10,10);

for (int i=10; i>=1; i--)
{
turn(100/i,10);
}


}

void turn(int spd, int count)
{
for (int ii=0; ii <=count; ii++)
{
for (int i=2; i <=8; i++){
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(i,HIGH);
delay(spd);}
digitalWrite(7,LOW);
}
}