プロジェクト 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. モジュラスツール紹介
ドットマトリックスモジュラスツールのオンライン版:
①リンクを開いて以下のページに入ります。

②このプロジェクトのドットマトリックスは 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 ドットマトリックスが前進、後退、停止パターンを交互に表示します。


