logo-site-sefid
Search
Close this search box.
راه-اندازی-دات-ماتریس-با-آردوینو

راه اندازی دات ماتریس با آردوینو

آموزش ماتریس LED هشت در هشت (8*8) مدل MAX7219 همراه با پیمایش متن و کنترل تحت سیستم عامل اندروید با استفاده از بلوتوث

در این آموزش آردوینو قصد داریم تا براه اندازی دات ماتریس با آردوینو vh Hl,ca nidl. به این منظور در ادامه به بحث‌وبررسی حول این موضوع می‌پردازیم.

بررسی اجمالی راه اندازی دات ماتریس با آردوینو

این آموزش با سه مثال همراه خواهد بود. مثال اول به تشریح اصول کاری پایه‌ای MAX7219 خواهیم پرداخت، در مثال دوم خواهیم آموخت که چگونه فرایند پیمایش متن در ماتریس LED هشت در هشت کار می‌کند و در سومین مثال، این تجهیزات را توسط بلوتوث و یک اپلیکیشن سفارشی ساخته شده تحت اندروید کنترل خواهیم کرد.

MAX7219

حال می‌توانیم نگاه دقیق‌تری به راه‌انداز MAX7219 داشته باشیم. این IC قادر خواهد بود که تا 64 LED مستقل را درحالی‌که تنها از 3 سیم برای اتصال با آردوینو استفاده می‌کند را راه‌اندازی کند و علاوه بر این ما می‌توانیم چندین راه‌انداز و ماتریس را به‌صورت زنجیری متصل کنیم و در این حالت نیز از همان 3 سیم استفاده کنیم. ما میتوانیم در آینده در بخش های مختلف آموزش رباتیک نیز از این مقاله استفاده کنیم.

راه اندازی دات ماتریس با آردوینو
راه اندازی دات ماتریس با آردوینو

64 ال‌ای‌دی توسط 16 پین خروجی IC راه‌ اندازی می‌شوند. سؤالی که در اینجا به وجود می‌آید این است که چگونه انجام این امر ممکن است. ذکر این نکته ضروری به نظر می‌رسد که بیشترین تعداد LED روشن به‌ صورت هم‌زمان در واقع هشت LED است. LEDها به‌ صورت مجموعه‌های سطری ستونی 8*8 مرتب شده‌اند؛ بنابراین، MAX7219 هر ستون را برای مدت کوتاهی فعال می‌کند و هم‌زمان هر ردیف را نیز راه‌ اندازی می‌کند. پس، با کلیدزنی سریع سطرها و ستون‌ها چشم انسان یک نور پیوسته را مشاهده می‌کند.

نحوه کلیدزنی سطری ستونی
نحوه کلیدزنی سطری ستونی

توجه داشته باشد که پین‌های یک ماتریس 8*8 LED مشترک داخلی به چه ترتیب چیده شده‌اند. به‌این‌ترتیب درنظرگرفتن این نکته در مواردی که می‌خواهید ماتریس خود را بسازید ضروری به نظر می‌رسد.

همچنین ذکر این نکته ضروری به نظر می‌رسد که یک صفحه مشترک برای MAX7219 همراه با یک مقاومت بین پین 5 ولتی و پین IC شماره 18 است. مقاومت برای تنظیم روشنایی یا شارش جریان به LEDها استفاده می‌شود.

مقاومت به‌کاررفته در برد جهت تنظیم روشنایی و تنظیم شارش جریان
مقاومت به‌کار رفته در برد جهت تنظیم روشنایی و تنظیم شارش جریان

در جدول زیر که از دیتاشیت IC برداشت شده است، مقدار مقاومتی که باید باتوجه‌ به افت ولتاژ LED استفاده کنیم، آورده شده است.

جدول مربوط به تعیین مقدار مقاومت لازم با استفاده از مقدار افت ولتاژ مستقیم LED
جدول مربوط به تعیین مقدار مقاومت لازم با استفاده از مقدار افت ولتاژ مستقیم LED

شماتیک مداری

حال به بررسی اتصال ماژول ماتریسی 8*8 LED به برد آردوینو می‌پردازیم. شماتیک مداری آن به‌صورت شکل زیر است:

شماتیک مداری اتصال برد آردوینو به ماتریس 8*8 LED
شماتیک مداری اتصال برد آردوینو به ماتریس 8*8 LED

Vcc و GND ماژول به پین‌های 5 ولتی و GND آردوینو و سه پین دیگر که DIN, CLK و  CS هستند به هر پین دیجیتال برد آردوینو متصل می‌شوند. اگر بخواهیم بیش از یک ماژول را متصل کنیم، تنها باید پین‌های خروجی برد قبلی را به پایه‌های ورودی ماژول جدید متصل کنیم. در واقع این پایه‌ها همه یکسان هستند با این تفاوت که پایه DOUT برد قبلی به پایه‌ی DIN برد جدید می‌رود.

کد مقدماتی آردوینوی MAX7219 

به‌محض اینکه ماژول‌ها را متصل کنیم، آماده هستیم تا کدنویسی آردوینو را برای مثال اول پیاده‌سازی کنیم. به این منظور از کتابخانه‌ی MaxMatrix استفاده می‌کنیم که از GitHub قابل دانلود است.

/*
      8x8 LED Matrix MAX7219 Example 01

   

   Based on the following library:
   GitHub | riyas-org/max7219  https://github.com/riyas-org/max7219
*/

#include <MaxMatrix.h>

int DIN = 7;   // DIN pin of MAX7219 module
int CLK = 6;   // CLK pin of MAX7219 module
int CS = 5;    // CS pin of MAX7219 module
int maxInUse = 1;


MaxMatrix m(DIN, CS, CLK, maxInUse); 

char A[] = {4, 8,
            B01111110,
            B00010001,
            B00010001,
            B01111110,
           };

char B[] = {4, 8,
            B01111111,
            B01001001,
            B01001001,
            B00110110,
           };

char smile01[] = {8, 8,
                  B00111100,
                  B01000010,
                  B10010101,
                  B10100001,
                  B10100001,
                  B10010101,
                  B01000010,
                  B00111100
                 };
char smile02[] = {8, 8,
                  B00111100,
                  B01000010,
                  B10010101,
                  B10010001,
                  B10010001,
                  B10010101,
                  B01000010,
                  B00111100
                 };
char smile03[] = {8, 8,
                  B00111100,
                  B01000010,
                  B10100101,
                  B10010001,
                  B10010001,
                  B10100101,
                  B01000010,
                  B00111100
                 };

void setup() {
  m.init(); // MAX7219 initialization
  m.setIntensity(8); // initial led matrix intensity, 0-15
}

void loop() {
  // Seting the LEDs On or Off at x,y or row,column position
  m.setDot(6,2,true); 
  delay(1000);
  m.setDot(6,3,true);
  delay(1000);
  m.clear(); // Clears the display
  for (int i=0; i<8; i++){
    m.setDot(i,i,true);
    delay(300);
  }
  m.clear();
  // Displaying the character at x,y (upper left corner of the character)  
  m.writeSprite(2, 0, A);
  delay(1000);

  m.writeSprite(2, 0, B);
  delay(1000);

  m.writeSprite(0, 0, smile01);
  delay(1000);
  
  m.writeSprite(0, 0, smile02);
  delay(1000);
  
  m.writeSprite(0, 0, smile03);
  delay(1000);
  
  for (int i=0; i<8; i++){
    m.shiftLeft(false,false);
    delay(300);
  }
  m.clear();

}

توضیحات: بنابراین در ابتدا به اضافه کردن کتابخانه‌ی MaxMatrix.h نیاز داریم که این کتابخانه پین‌هایی که به ماژول متصل هستند را تعریف می‌کند و تعداد ماژول‌هایی که استفاده می‌کنیم را تنظیم می‌کند و MaxMatrix را تعریف می‌کند.

برای نمایش کاراکترها در ابتدا به تعریف آن ها در آرایه‌ای از کاراکترها یا بیت‌ها نیاز داریم و در اینجا چندین مثال در این مورد آورده شده است. باید توجه داشته باشیم که بیت‌ها چگونه کاراکترهای صفر و یک را تشکیل می‌دهند. در این شرایط 90 درجه چرخانده می‌شوند اما مثال کتابخانه این پیشنهاد را می‌دهد که از آن ها به‌گونه‌ای استفاده شود که بعداً پیاده‌سازی تابع shiftLeft برای پیمایش متن ساده‌تر باشد.

چرخش 90 درجه
چرخش 90 درجه

در بخش تنظیمات تنها نیاز به مقدار دهی اولیه‌ی ماژول داریم و باید در این بخش روشنایی LEDها را نیز تنظیم کنیم. در بخش حلقه با استفاده از تابع ()setDot می‌توانیم هر LED در هر مختصات X و Y در موقعیت سطری و ستونی را روشن کنیم و با استقاده از تابع ()clear می‌توانیم نمایشگر را پاک کنیم.

روشن شدن LEDها با توجه به موقعیت سطری و ستونی
روشن شدن LEDها با توجه به موقعیت سطری و ستونی

برای نمایش نویسه‌های از پیش تعریف شده از تابع ()writeSprite استفاده می‌کنیم و در این حالت دو آرگومان اول موقعیت X و Y گوشه سمت چپ بالای کاراکتر است. در انتها با استفاده از تابع ()shiftLeft کاراکتر را جابه‌جا می‌کنیم یا به سمت چپ پیمایش می‌کنیم.

کد آردوینوی پیمایش ماتریس 8*8 ال‌ای‌دی

 در ادامه قصد داریم تا به مثال متن پیمایش بپردازیم و تفاوت‌های آن را مورد بررسی قرار دهیم. در کد زیر توضیحات مربوط به آن قابل‌ مشاهده است:

/*
      8x8 LED Matrix MAX7219 Scrolling Text Example

   Based on the following library:
   GitHub | riyas-org/max7219  https://github.com/riyas-org/max7219
*/


#include <MaxMatrix.h>
#include <avr/pgmspace.h>

PROGMEM const unsigned char CH[] = {
  3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
  1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
  3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
  5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
  4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
  5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
  5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
  1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
  3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
  3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
  5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
  5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
  2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
  4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
  2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
  4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
  4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
  3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
  4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
  4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3
  4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4
  4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5
  4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6
  4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7
  4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8
  4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9
  2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :
  2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;
  3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // <
  3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // =
  3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >
  4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?
  5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @
  4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
  4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
  4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
  4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D
  4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E
  4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
  4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G
  4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H
  3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I
  4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J
  4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K
  4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L
  5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M
  5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N
  4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O
  4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P
  4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q
  4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R
  4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S
  5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T
  4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U
  5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V
  5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W
  5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X
  5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y
  4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z
  2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [
  4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash
  2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]
  3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat
  4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _
  2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `
  4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a
  4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b
  4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c
  4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d
  4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
  3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f
  4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g
  4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h
  3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
  4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j
  4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k
  3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l
  5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m
  4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n
  4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o
  4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p
  4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q
  4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
  4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
  3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
  4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u
  5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v
  5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w
  5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x
  4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y
  3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
  3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {
  1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |
  3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }
  4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~
};

int DIN = 7;   // DIN pin of MAX7219 module
int CLK = 6;   // CLK pin of MAX7219 module
int CS = 5;    // CS pin of MAX7219 module
int maxInUse = 2;

MaxMatrix m(DIN, CS, CLK, maxInUse);

byte buffer[10];

char text[]= "HowToMechatronics.com  "; // Scrolling text

void setup() {
  m.init(); // module initialize
  m.setIntensity(15); // dot matix intensity 0-15
}

void loop() {

  printStringWithShift(text, 100); // (text, scrolling speed)

}
// Display=the extracted characters with scrolling
void printCharWithShift(char c, int shift_speed) {
  if (c < 32) return;
  c -= 32;
  memcpy_P(buffer, CH + 7 * c, 7);
  m.writeSprite(32, 0, buffer);
  m.setColumn(32 + buffer[0], 0);

  for (int i = 0; i < buffer[0] + 1; i++)
  {
    delay(shift_speed);
    m.shiftLeft(false, false);
  }
}
// Extract the characters from the text string
void printStringWithShift(char* s, int shift_speed) {
  while (*s != 0) {
    printCharWithShift(*s, shift_speed);
    s++;
  }
}

توضیحات: در اینجا ما باید یک کتابخانه‌ی اضافی از PROGMEN قرار دهیم که بهبود دهنده‌ی متغیر است و برای ذخیره‌سازی اطلاعات از فلش مموری به‌جای SRAM استفاده می‌کند. هنگامی که پایگاه‌داده‌ای از متغیرها داریم که استاتیک هستند مانند همین نمونه که حروف و کاراکترها را تعریف می‌کنیم، بهتر است که آن ها را در یک فلش مموری ذخیره کنیم زیرا 32 هزار بایت آن در مقایسه با 2 هزار بایت SRAM بسیار بزرگ‌تر است.

نوشتن عبارت HOW با LED توسط کدنویسی در آردوینو
نوشتن عبارت HOW با LED توسط کدنویسی در آردوینو

در مرحله‌ی بعدی با یک آرایه از کاراکتر پیمایش یک متن را تعریف می کنیم و در بهش حلقه‌ی تابع سفارشی، printStringWithShift پیمایش متن را روی ماتریس LED با سرعتی برابر با میلی ثانیه چاپ می کند. اولین موضوعی که این تابع سفارشی مورد بررسی انجام می دهد این است که کاراکترها را از رشته ی متن استخراج می‌کند و پس از آن این کاراکترهای پیمایشی را روی ماتریس LED نمایش میدهد.

اپلیکیشن اندروید برای کنترل ماتریس 8*8 LED توسط بلوتوث

حال که با شیوه‌ی عملکرد MAX7219 آشنا شدیم، می‌توانیم سومین مثال را که در مورد یک پروژه‌ی عملی آردوینو است را شروع کنیم. در این پروژه یک اپلیکیشن سفارشی اندروید خواهیم ساخت که از طریق رابط بلوتوث برای کنترل ماتریس LED به کار می‌رود.

اپلیکیشن اندروید با رابط بلوتوث
اپلیکیشن اندروید با رابط بلوتوث

در ادامه کد آردوینوی مرتبط آورده شده است و اکنون تغییرات را در مقایسه با مثال قبلی مشاهده می‌کنیم.

/*
      8x8 LED Matrix MAX7219 Scrolling Text
          Android Control via Bluetooth


   Based on the following library:
   GitHub | riyas-org/max7219  https://github.com/riyas-org/max7219
*/

#include <MaxMatrix.h>
#include <SoftwareSerial.h>
#include <avr/pgmspace.h>

PROGMEM const unsigned char CH[] = {
  3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
  1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
  3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
  5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
  4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
  5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
  5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
  1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
  3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
  3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
  5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
  5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
  2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
  4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
  2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
  4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
  4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
  3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
  4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
  4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3
  4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4
  4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5
  4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6
  4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7
  4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8
  4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9
  2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :
  2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;
  3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // <
  3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // =
  3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >
  4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?
  5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @
  4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
  4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
  4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
  4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D
  4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E
  4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
  4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G
  4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H
  3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I
  4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J
  4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K
  4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L
  5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M
  5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N
  4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O
  4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P
  4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q
  4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R
  4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S
  5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T
  4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U
  5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V
  5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W
  5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X
  5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y
  4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z
  2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [
  4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash
  2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]
  3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat
  4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _
  2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `
  4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a
  4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b
  4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c
  4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d
  4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
  3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f
  4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g
  4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h
  3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
  4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j
  4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k
  3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l
  5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m
  4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n
  4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o
  4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p
  4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q
  4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
  4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
  3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
  4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u
  5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v
  5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w
  5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x
  4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y
  3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
  3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {
  1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |
  3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }
  4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~
};

int dIn = 7;   // DIN pin of MAX7219 module
int clk = 6;   // CLK pin of MAX7219 module
int cs = 5;    // CS pin of MAX7219 module

int maxInUse = 2;    // Number of MAX7219's connected

MaxMatrix m(dIn, cs, clk, maxInUse);
SoftwareSerial Bluetooth(8, 7); // Bluetooth

byte buffer[10];
char incomebyte;
int scrollSpeed = 100;
char text[100] = "HowToMechatronics.com  "; // Initial text message
int brightness = 15;
int count = 0;
char indicator;

void setup() {
  m.init(); // MAX7219 initialization
  m.setIntensity(brightness); // initial led matrix intensity, 0-15
  Bluetooth.begin(38400); // Default communication rate of the Bluetooth module
}

void loop() {
  // Printing the text
  printStringWithShift(text, scrollSpeed);
  
  if (Bluetooth.available()) {   // Checks whether data is comming from the serial port
    indicator = Bluetooth.read();   // Starts reading the serial port, the first byte from the incoming data
    // If we have pressed the "Send" button from the Android App, clear the previous text
    if (indicator == '1') {
      for (int i = 0; i < 100; i++) {
        text[i] = 0;
        m.clear();
      }
      // Read the whole data/string comming from the phone and put it into text[] array.
      while (Bluetooth.available()) {
        incomebyte = Bluetooth.read();
        text[count] = incomebyte;
        count++;
      }
      count = 0;
    }
    // Adjusting the Scrolling Speed
    else if (indicator == '2') {
      String sS = Bluetooth.readString();
      scrollSpeed = 150 - sS.toInt(); // Milliseconds, subtraction because lower value means higher scrolling speed
    }
    // Adjusting the brightness
    else if (indicator == '3') {
      String sB = Bluetooth.readString();
      brightness = sB.toInt();
      m.setIntensity(brightness);
    }
  }

}

void printCharWithShift(char c, int shift_speed) {
  if (c < 32) return;
  c -= 32;
  memcpy_P(buffer, CH + 7 * c, 7);
  m.writeSprite(32, 0, buffer);
  m.setColumn(32 + buffer[0], 0);

  for (int i = 0; i < buffer[0] + 1; i++)
  {
    delay(shift_speed);
    m.shiftLeft(false, false);
  }
}

void printStringWithShift(char* s, int shift_speed) {
  while (*s != 0) {
    printCharWithShift(*s, shift_speed);
    s++;
  }
}

void printString(char* s)
{
  int col = 0;
  while (*s != 0)
  {
    if (*s < 32) continue;
    char c = *s - 32;
    memcpy_P(buffer, CH + 7 * c, 7);
    m.writeSprite(col, 0, buffer);
    m.setColumn(col + buffer[0], 0);
    col += buffer[0] + 1;
    s++;
  }
}

توضیحات:

در ابتدا باید کتابخانه‌ی SoftwareSerial.h را اضافه کنیم که رابط بلوتوث را فعال می‌کند و برخی متغیرهای موردنیاز برای برنامه را تعریف می‌کند. در بخش تنظیمات نیاز داریم تا بلوتوث را در نرخ باود 38400 بیت بر ثانیه راه‌اندازی کنیم. ما در اینجا یک پیغام نمایشی برای شروع انتخاب کرده‌ایم که سرعت پیمایش 100 میلی‌ثانیه‌ای برای تأخیر را در نظر دارد.

در مرحله‌ی بعدی، با استفاده از تابع ()Bluetooth.available این موضوع را بررسی خواهیم کرد که آیا داده های ورودی از پورت سریال وجود دارد یا خیر و اینکه اگر وجود دارد، با استفاده از تابع Bluetooth.read شروع به خواندن ورودی از پورت سریال با یک بیت برای هر تکرار کنیم؛ بنابراین اولین بایت ورودی همیشه در متغیر indicator ذخیره خواهد شد و با توجه به آن انتخاب می کنیم که آیا پیام متنی را تغییر دهیم یا سرعت پیمایش یا روشنایی ماتریس LED را.

اگر نگاهی به بلوک‌های کد برنامه اندروید بیندازیم، متوجه می‌شویم که وقتی روی دکمه “ارسال” کلیک شود، ابتدا بایت نشانگر را ارسال می‌کنیم، در این مثال “1”، به این معنی است که ما می‌خواهیم پیام متنی را تغییر دهیم. برای انجام این کار، در سمت آردوینو، کل آرایة کاراکترها و همچنین صفحه‌نمایش ماتریس LED را پاک می‌کنیم. سپس در حلقه “while” بقیة داده‌ها را در پورت سریال می‌خوانیم، و آنها، همان پیام‌هایی هستند که در کادر متن برنامه اندروید تایپ شده‌اند.

 

درصورتی‌ که متغیر نشانگر “2” باشد، به این معنی است که ما موقعیت اسلایدر سرعت پیمایش را تغییر داده‌ایم، بنابراین مقدار جدید آن را با استفاده از تابع () Bluetooth.readString می‌خوانیم و سرعت پیمایش را تنظیم می‌کنیم. به همین ترتیب ما روشنایی LEDها را تنظیم می‌کنیم.

به‌این‌ترتیب این بخش از آموزش نیز کامل شد.

به امید موفقیت روزافزون.

رضا قنبری
متخصص آموزش رباتیک

رضا قنبری هستم متخصص آموزش رباتیک با بیش از 10 سال سابقه فعالیت در ایران

این مطلب را به اشتراک بگذارید

ماژول کاهنده

ماژول كاهنده قبل از خواندن مقاله ماژول كاهنده بهتر است در نظر داشته باشید مقالاتی که با عنوان ماژول در سایت قرار گرفته اند از

ماژول تشخیص دود و گاز

ماژول تشخیص دود و گاز قبل از خواندن این مقاله بهتر است در نظر داشته باشید مقالاتی که با عنوان ماژول در سایت قرار گرفته

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *