Эксперимент 21. Анимация

Компьютерная анимация — последовательный показ (слайд-шоу) заранее подготовленных графических файлов. Мы уже создавали анимацию на 7-ми сегментном LED - индикаторе, Эксперимент 14. Секундомер, но там мы могли отображать только буквенно-цифровые символы.
LED - матрица с которой мы познакомились в предыдущем эксперименте, позволяет не только отображать картинки 8х8 точек (пикселей), но и создавать простые игры.

В данном эксперименте сделаем анимацию подмигивающего смайлика.

Схема эксперимента

Рисунок 1. Электрическая принципиальная схема эксперимента

Рисунок 2. Монтажная схема эксперимента

Для управления LED - матрицей понадобится 16 пинов контроллера. На выводы строк ставим токоограничительные резисторы 120 Ом.

Программный код эксперимента

Exp21
  1. int R[] = {2,7,A5,5,13,A4,12,A2};
  2. int C[] = {6,11,10,3,A3,4,8,9};
  3.  
  4. unsigned char ris1[8][8] = {
  5. 0,0,0,0,0,0,0,0,
  6. 0,1,1,0,0,1,1,0,
  7. 0,1,1,0,0,1,1,0,
  8. 0,0,0,0,0,0,0,0,
  9. 0,0,0,0,0,0,0,0,
  10. 0,1,0,0,0,0,1,0,
  11. 0,0,1,1,1,1,0,0,
  12. 0,0,0,0,0,0,0,0,
  13. };
  14.  
  15. unsigned char ris2[8][8] = {
  16. 0,0,0,0,0,0,0,0,
  17. 0,1,1,0,0,0,0,0,
  18. 0,1,1,0,1,1,1,1,
  19. 0,0,0,0,0,0,0,0,
  20. 0,0,0,0,0,0,0,0,
  21. 0,1,0,0,0,0,1,0,
  22. 0,0,1,1,1,1,0,0,
  23. 0,0,0,0,0,0,0,0,
  24. };
  25.  
  26. void setup() {
  27. for(int i = 0;i<8;i++) {
  28. pinMode(R[i],OUTPUT);
  29. pinMode(C[i],OUTPUT);
  30. }
  31. }
  32.  
  33. void loop(){
  34. for(int i = 0 ; i < 70 ; i++) {
  35. Display(ris1);
  36. }
  37. for(int i = 0 ; i < 70 ; i++) {
  38. Display(ris2);
  39. }
  40. }
  41.  
  42. void Display(unsigned char dat[8][8]) {
  43. for(int r = 0; r<8 ; r++) {
  44. digitalWrite(R[r],LOW);
  45. for(int c = 0;c<8;c++) {
  46. digitalWrite(C[c],dat[r][c]);
  47. }
  48. delay(1);
  49. Clear();
  50. }
  51. }
  52.  
  53. void Clear() {
  54. for(int i = 0;i<8;i++) {
  55. digitalWrite(C[i],LOW);
  56. digitalWrite(R[i],HIGH);
  57. }
  58. }

В программе пины контроллера по столбцам и строкам для удобства объединены в отдельные массивы R[] и C[].
Для отрисовки вызываем функцию Display()которая принимает в качестве аргумента массив зашифрованной картинки, и далее в первом цикле перебираются пины строк и подается сигнал LOW. Вложенный цикл перебирает столбцы и в соответствие с данными в массиве картинки присваивает соответствующему пину сигнал LOW, если в массиве значение 0 или сигнал HIGH, если значение 1.

Дополнительное задание

Создайте свою анимацию из нескольких картинок