プロジェクト 9 8*16 LED ボード

説明

ロボットに 8*16 LED ボードを追加すると、素晴らしい効果が得られます。Keyestudio の 8*16 ドットマトリックスはこの要件を満たすことができます。これを使用することで、顔の絵文字、パターン、またはその他の興味深いディスプレイを自分で作成できます。この 8*16 LED ライトボードには 128 個の LED が搭載されています。マイクロプロセッサ (Arduino) のデータは 2 線バスインターフェースを通じて AiP1640 と通信し、モジュール上の 128 個の LED を制御して、ドットマトリックスに必要なパターンを生成します。配線を簡単にするために、HX-2.54 4Pin 配線が提供されています。

仕様

  • 動作電圧: DC 3.3-5V

  • 消費電力: 400mW

  • 発振周波数: 450KHz

  • 駆動電流: 200mA

  • 動作温度: -40~80℃

  • 通信方式: 2 線バス

コンポーネント

8*16 ドットマトリックスディスプレイ

回路図

8*16 ドットマトリックスの原理:

8*16 ドットマトリックスの各 LED ライトを制御するにはどうすればよいでしょうか?1 バイトは 8 ビットを持ち、各ビットは 0 または 1 です。ビットが 0 の場合は LED をオフにし、ビットが 1 の場合は LED をオンにします。したがって、1 バイトはドットマトリックスの 1 行の LED を制御でき、16 バイトは 16 列の LED ライトを制御できます。つまり、8*16 ドットマトリックスです。

インターフェース説明と通信プロトコル:

マイクロプロセッサ (Arduino) のデータは 2 線バスインターフェースを通じて AiP1640 と通信します。

通信プロトコル図は以下の通りです:

(SCLK) は SCL、(DIN) は SDA です:

①データ入力の開始条件: SCL がハイレベルで、SDA がハイからロー に変わります。

②データコマンド設定の場合、以下の図に示すような方法があります:

サンプルプログラムでは、アドレスに 1 を自動的に追加する方法を選択し、バイナリ値は 0100 0000 で、対応する 16 進値は 0x40 です。

③アドレスコマンド設定の場合、以下に示すようにアドレスを選択できます。

サンプルプログラムでは最初の 00H を選択し、バイナリ数 1100 0000 は 16 進数 0xc0 に対応します。

④データ入力の要件は、データ入力時に SCL がハイレベルであり、SDA 上の信号は変わらないままである必要があります。SCL 上のクロック信号がロー レベルの場合のみ、SDA 上の信号を変更できます。データ入力は下位ビットが最初で、上位ビットが後です。

⑤データ伝送を終了する条件は、SCL がロー の場合 SDA がロー で、SCL がハイ の場合 SDA レベルもハイ になることです。

⑥ディスプレイ制御、異なるパルス幅を設定します。パルス幅は以下に示すように選択できます。

この例では、パルス幅 4/16 を選択し、16 進数は 1000 1010 で 0x8A に対応します。

4. モジュラスツール紹介

ドットマトリックスモジュラスツールのオンライン版:

http://dotmatrixtool.com/#

①リンクを開いて以下のページに入ります。

②このプロジェクトのドットマトリックスは 8*16 なので、高さを 8、幅を 16 に設定します。以下に示すとおりです。

③パターンから 16 進数データを生成します

以下に示すように、左マウスボタンを押して選択し、右ボタンでキャンセルし、必要なパターンを描き、Generate をクリックすると、必要な 16 進数データが生成されます。

接続図

配線注意: 8x16 LED パネルの GND、VCC、SDA、SCL は、それぞれ keyestudio センサー拡張ボードの -(GND)、+ (VCC)、A4、A5 に接続され、2 線シリアル通信を行います。(注: このピンは Arduino IIC に接続されていますが、このモジュールは IIC 通信ではありません。任意の 2 つのピンで接続できます。)

テストコード

スマイルフェイスを表示するコードです。

/*
 keyestudio Mini Tank Robot V2.1
 lesson 9.1
 Matrix  face
 http://www.keyestudio.com
*/ 
// モジュラスツールからのスマイリーフェイスのデータ
unsigned char smile[] = {0x00, 0x00, 0x1c, 0x02, 0x02, 0x02, 0x5c, 0x40, 0x40, 0x5c, 0x02, 0x02, 0x02, 0x1c, 0x00, 0x00};

#define SCL_Pin  A5  // クロックピンを A5 に設定
#define SDA_Pin  A4  // データピンを A4 に設定

void setup()
{
  // ピンを出力に設定
  pinMode(SCL_Pin,OUTPUT);
  pinMode(SDA_Pin,OUTPUT);
  // ディスプレイをクリア
  // matrix_display(clear);
}

void loop()
{
  matrix_display(smile);  // スマイルフェイスを表示
}
// ドットマトリックスディスプレイの関数

void matrix_display(unsigned char matrix_value[])
{
  IIC_start();  // データ伝送開始条件の関数を使用
  IIC_send(0xc0);  // アドレスを選択
  
  for(int i = 0;i < 16;i++) // パターンデータは 16 ビット
  {
     IIC_send(matrix_value[i]); // パターンデータを送信
  }

  IIC_end();   // パターンデータの伝送を終了
  IIC_start();
  IIC_send(0x8A);  // ディスプレイ制御、パルス幅を 4/16 に設定
  IIC_end();
}

// データ伝送を開始する条件
void IIC_start()
{
  digitalWrite(SCL_Pin,HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,LOW);
  delayMicroseconds(3);
}
// データを送信
void IIC_send(unsigned char send_data)
{
  for(char i = 0;i < 8;i++)  // 各バイトは 8 ビット
  {
      digitalWrite(SCL_Pin,LOW);  // クロックピン SCL_Pin をプルダウンして SDA の信号を変更
      delayMicroseconds(3);
      if(send_data & 0x01)  // 各ビットの 1 または 0 に応じて SDA_Pin のハイ・ロー レベルを設定
      {
        digitalWrite(SDA_Pin,HIGH);
      }
      else
      {
        digitalWrite(SDA_Pin,LOW);
      }
      delayMicroseconds(3);
      digitalWrite(SCL_Pin,HIGH); // クロックピン SCL_Pin をプルアップして伝送を停止
      delayMicroseconds(3);
      send_data = send_data >> 1;  // ビットごとに検出し、データを右に 1 ビットシフト
  }
}

// データ伝送を終了する標識
void IIC_end()
{
  digitalWrite(SCL_Pin,LOW);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,LOW);
  delayMicroseconds(3);
  digitalWrite(SCL_Pin,HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,HIGH);
  delayMicroseconds(3);
}
//******************************************************

テスト結果

接続図に従って配線します。DIP スイッチを右端に切り替えて電源を入れると、ドットマトリックスにスマイルフェイスが表示されます。

拡張練習

モジュロツール (http://dotmatrixtool.com/#) を使用して、ドットマトリックスが前進、停止パターンを交互に表示し、パターンをクリアし、時間間隔は 2000 ミリ秒です。

モジュラスツールを使用して表示するグラフィックコードを取得します。

スタート: 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01

前進: 0x00,0x00,0x00,0x00,0x00,0x24,0x12,0x09,0x12,0x24,0x00,0x00,0x00,0x00,0x00,0x00

後退: 0x00,0x00,0x00,0x00,0x00,0x24,0x48,0x90,0x48,0x24,0x00,0x00,0x00,0x00,0x00,0x00

左回転: 0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x28,0x10,0x44,0x28,0x10,0x44,0x28,0x10,0x00

右回転: 0x00,0x10,0x28,0x44,0x10,0x28,0x44,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00

停止: 0x2E,0x2A,0x3A,0x00,0x02,0x3E,0x02,0x00,0x3E,0x22,0x3E,0x00,0x3E,0x0A,0x0E,0x00

表示をクリアするコード: 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

複数のパターンがシフトするコード:

/* keyestudio Mini Tank Robot V2.1
 lesson 9.2
 Matrix loop
 http://www.keyestudio.com
*/ 
// 配列、パターンのデータを保存するために使用、自分で計算するか、モジュラスツールから取得できます
unsigned char start01[] = 
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char front[] = 
{0x00,0x00,0x00,0x00,0x00,0x24,0x12,0x09,0x12,0x24,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char back[] = 
{0x00,0x00,0x00,0x00,0x00,0x24,0x48,0x90,0x48,0x24,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char left[] = 
{0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x28,0x10,0x44,0x28,0x10,0x44,0x28,0x10,0x00};
unsigned char right[] = 
{0x00,0x10,0x28,0x44,0x10,0x28,0x44,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char STOP01[] = 
{0x2E,0x2A,0x3A,0x00,0x02,0x3E,0x02,0x00,0x3E,0x22,0x3E,0x00,0x3E,0x0A,0x0E,0x00};
unsigned char clear[] = 
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
#define SCL_Pin  A5  // クロックピンを A5 に設定
#define SDA_Pin  A4  // データピンを A4 に設定
void setup(){
  // ピンを出力に設定
  pinMode(SCL_Pin,OUTPUT);
  pinMode(SDA_Pin,OUTPUT);
  // ディスプレイをクリア
  matrix_display(clear);
}
void loop(){
  matrix_display(start01);  // スタートパターンを表示
  delay(2000);
  matrix_display(front);    // 前進パターン
  delay(2000);
  matrix_display(STOP01);   // 停止パターン
  delay(2000);
  matrix_display(clear);    // ディスプレイをクリア
  delay(2000);
}
// この関数はドットマトリックスの表示に使用されます
void matrix_display(unsigned char matrix_value[])
{
  IIC_start();  // データ伝送開始の関数を呼び出す
  IIC_send(0xc0);  // アドレスを選択
  
  for(int i = 0;i < 16;i++) // パターンデータは 16 ビット
  {
     IIC_send(matrix_value[i]); // パターンを送信するデータ
  }
  IIC_end();   // パターンデータの伝送を終了
  IIC_start();
  IIC_send(0x8A);  // ディスプレイ制御、パルス幅を 4/16 に設定
  IIC_end();
}
// データ伝送を開始する条件
void IIC_start()
{
  digitalWrite(SCL_Pin,HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,LOW);
  delayMicroseconds(3);
}
// データを送信
void IIC_send(unsigned char send_data)
{
  for(char i = 0;i < 8;i++)  // 各バイトは 8 ビット
  {
      digitalWrite(SCL_Pin,LOW);  // クロックピン SCL をプルダウンして SDA の信号を変更
      delayMicroseconds(3);
      if(send_data & 0x01)  // 各ビットの 1 または 0 に応じて SDA_Pin のハイ・ロー レベルを設定
      {
        digitalWrite(SDA_Pin,HIGH);
      }
      else
      {
        digitalWrite(SDA_Pin,LOW);
      }
      delayMicroseconds(3);
      digitalWrite(SCL_Pin,HIGH); // クロックピン SCL_Pin をプルアップしてデータ伝送を停止
      delayMicroseconds(3);
      send_data = send_data >> 1;  // ビットごとに検出し、データを右に 1 ビットシフト
  }}
// データ伝送が終了する標識
void IIC_end()
{
  digitalWrite(SCL_Pin,LOW);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,LOW);
  delayMicroseconds(3);
  digitalWrite(SCL_Pin,HIGH);
  delayMicroseconds(3);
  digitalWrite(SDA_Pin,HIGH);
  delayMicroseconds(3);} 
//*****************************************************

開発ボードにコードをアップロードすると、8*16 ドットマトリックスが前進、後退、停止パターンを交互に表示します。