フォト
2023年3月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

« 4連8x8ドットLEDマトリックスを試してみる | トップページ | IchigoJamでMAX7219 8x8ドットLEDマトリックスを制御する »

2016年7月 5日 (火)

4連8x8ドットLEDマトリックスを試してみる 続編

前回の続きです。

4連8x8ドットLEDマトリックス2つを連結して32x16ドット表示にしてみました。
スケッチは前回からの少々の改造で実装出来ました。

01

1つめの出力を2つめの入力に接続しいます。増やしても5線のみので制御できます。

16x16ドットの日本語文を表示するため、自作フォントライブラリを利用しました。
フォントをmicroSDカードから読むため3.3V稼働させています。
(Arduino Unoも3.3V稼働出来るものを利用)

MAX7219としては3.3Vは動作保証外ですが問題なく動作しました。
3.3VでもOKなので、ARMやESP-WROOM-02でも利用出来ますね。

動作の様子


下段のモジュールのLEDが不良のため1点だけ点灯しませんが
動作としては期待以上に動いてくれました。

ただ、Arduino標準のshiftOut()関数によるシリアルデータの送り出しが遅いようです。
早いスクロール表示が出来ませんでした。そのため高速版のshiftOut()に置き換えました。

8個もLEDマトリックスを使用しているので消費電流が気になり、計ってみました。

Dscn5391

表示部(Arduino Unoを除く)は、最大35.1mAでした。まあ、こんなもんですかね。
バッテリー駆動も可能なレベルですかね。

このモジュールなかなか使いやすですね。用途に応じて、連結して利用出来ます。
更に、4連基板をカットして利用することも出来るみたいです。

基板の裏はこんな感じ

Dscn5380

今回作成したスケッチ(プログラム)  ダウンロード max7219_test3.zip (6.2K)

いくつかのファイルに別れますが、取りあえずメイン部はこんな感じです。

// max7219_test3.ino
// MAX7179ドライバーライブラリ動作チェック 32x16ドットバージョン
// 2016/07/05 たま吉さん

#include <string.h>
#include <sdfonts.h>

#include "MAX7219_matrix.h"
#include "libmatrix.h"

// MAX7219接続
#define MAX7219_DIN   2 // DIN
#define MAX7219_CLK   4 // CLK
#define MAX7219_LOAD  3 // LOAD

// SDカード接続
#define MOSI_SD   11    // SDカードのMOISへ接続
#define MISO_SD   12    // SDカードのMISOへ接続
#define CLK_SD    13    // SDカードのCLKへ接続
#define CS_SD     10    // SDカードモジュールCSへ接続

#define  SCREENS   8    // MAX7219カスケード接続数
#define  BRT       0    // LEDの輝度(0~7)
#define  SC_WIDTH  32   // マトリック表示横ドット数
#define  SC_HIGHT  16   // マトリック表示縦ドット数

uint8_t fbuf[SC_WIDTH*SC_HIGHT/8];  // 表示用バッファ

// 表示用バッファを表示
// (フレームバッファ32x16ドットをMAX7219用バッファ64x8にマッピング)
void update_screen() {
  uint8_t* ptr = MAX7219_getBuffer();
  for (uint8_t i=0; i < 8; i++) {
    memcpy(&ptr[i*8],&fbuf[i*4+32], 4);
    memcpy(&ptr[i*8+4],&fbuf[i*4], 4);
  }
  MAX7219_update();  
}

// デモ
void demo() {
  uint8_t font[MAXFONTLEN];
  SDfonts.open();            // フォントのオープン
  SDfonts.setFontSize(16);    // フォントサイズの設定

  char* str = "こんにちは埼玉県!熱いぞ!埼玉県!";

  MAX7219_clear();
  while(1) {
    str = SDfonts.getFontData(font, str);  // フォントデータの取得
    if (!str)
      break;
    scrollInFont(fbuf, font, 30);
  }
  SDfonts.close(); 
}

// 1文字分スクロール挿入表示
void scrollInFont(uint8_t*ptr, uint8_t *fnt, uint16_t dt) {
  for (int8_t t = 0; t < 16; t++) {
    scrollBitmap(ptr, SC_WIDTH, SC_HIGHT, B0001); // 左スクロール
    clearBitmapAt(ptr, SC_WIDTH, SC_HIGHT, SC_WIDTH-t-1, 0, SC_HIGHT, SC_HIGHT);
    setBitmapAt(ptr, SC_WIDTH, SC_HIGHT, SC_WIDTH-t-1, 0, fnt, SC_HIGHT, SC_HIGHT);
    update_screen();
    delay(dt);
  }  
}

void setup() {
  //Serial.begin(115200);
  SDfonts.init(10);     // フォント管理の初期化
  
  // マトリック表示ドライバの初期化
  MAX7219_init(MAX7219_DIN, MAX7219_CLK, MAX7219_LOAD, SCREENS, BRT);
}

void loop() {
  MAX7219_clear();
  demo();
  delay(1000);
}

別途自作ライブラリ sdfonts を利用しています。
  ・sdfonts : Arduino用漢字フォントライブラリ SDカード版
    https://github.com/Tamakichi/Arduino-KanjiFont-Library-SD

今まで、LEDドットマトリックスを色々やってきましたが、このモジュールの利用で
落ち着きそうです。

関連記事
4連8x8ドットLEDマトリックスを試してみる 続々編
・4連8x8ドットLEDマトリックスを試してみる 続編 (この記事です)
4連8x8ドットLEDマトリックスを試してみる

« 4連8x8ドットLEDマトリックスを試してみる | トップページ | IchigoJamでMAX7219 8x8ドットLEDマトリックスを制御する »

arduino」カテゴリの記事

表示器制御関連」カテゴリの記事

コメント

最近四連LEDマトリックスを手に入れたのでこのページを参考にさせてもらいました。メインのシケッチを試しにIDE1.8.4でコンパイルしてみると、エラー続出でした。arduino.h が見つからないからスタートして、それを適当なところ(hardware/esp32)からコピーしたりしましたが、uint_8 が全部引っかかったり、不思議なエラー続出で諦めました。もし、よろしければご確認いただけませんか。
ちなみに、いろいろなボードやセンサー、表示器などを試しているので基本的な操作・導入は間違っていないと思うのですが。厚かましいお願いで申し訳ありません。

ヨシヅミさん

arduino.h を Arduino.h に修正して下さい。
Windows環境では問題ないですが、
LinuxやMacでは、大文字・小文字を識別するためこれではエラーになっちゃいますね。
ご迷惑おかけしました。

たま吉さん、早速のご回答を有難うございました。私もけさ目が覚めた瞬間にwindows版を試そうと思いつきました。最近、開発環境をほぼラズパイに移したのですが、まだスキルが伴っていませんね。今朝のアドバイスに従い、メインスケッチとライブラリ数カ所のarduino.h をArduino.h に変更しただけで全てのエラーがなくなりました。早速、昨夜準備したSDカードやLED を接続して、試したところ、一発でうまく表示できました。素晴らしいプログラムを公開していただいて有難うございました。これまでに8x8 LED単体のものを数個購入して、それを横に並べてアルファベットをスクロールするスケッチのサンプルを手に入れて、8266のWiFi と組み合わせたりしたのですが、今回手に入れた四連LED は、接続方向が以前のものと90度違っており、スクロールの向きが垂直になり、水平方向にスクロールするサンプルを探していて検索で見つけ、今回使わせていただきました。お陰様で、一気に漢字まで使える環境が整い、今後活用できそうで大変嬉しい思いです。重ねて有難うございました。

私もこのページを見て四連LEDマトリックスを買いました。
しかし、
#include  ←このまま使えるのですか(オレンジ色ではなく黒いままです)
#include "MAX7219_matrix.h" ←Matrix.hで代用できますか
#include "libmatrix.h" ←これは探せませんでした。
このような状況で前に進みません。(泣)
githubも英語でよくわからないので、もしもよろしければ素人にもできるやり方を教えていただければ助かります。

いわさん

> #include  ←このまま使えるのですか(オレンジ色ではなく黒いままです)
> #include "MAX7219_matrix.h" ←Matrix.hで代用できますか
> #include "libmatrix.h" ←これは探せませんでした。

ヘッダーファイル、
#include "MAX7219_matrix.h"
#include "libmatrix.h"
は、「今回作成したスケッチ(プログラム) ダウンロード max7219_test3.zip (6.2K)」のリンクから
ダウンロードし、解凍したフォルダmax7219_test3に入っています。

sdfontsライブラリは別途、githubから入手する必要があります。
github公開のダウンロード直リンクは下記の通りです。
https://github.com/Tamakichi/Arduino-KanjiFont-Library-SD/archive/master.zip

ダウンロードし圧縮圧縮ファイルを解凍し、その中の
\iblary\sdfonts フォルダをArduinoのliblaryにコピー、
\fontbin フォルダ内の FONT.BIN、FONTLCD.BIN SDカードの直下に入れて下さい。
(SDカードシールドまたはモジュールが必要です)

ありがとうございます!
やってみます。後ほど報告させていただきます。

1つではうまくいきましたが、2つ連結するとうまくいきません。
また、SDモジュールを購入しましたが、私が持っているArduinoUNOに接続したので壊れてしまったのでしょうか。ネットを見ると「3.3vでないとSDが壊れる」とありますので・・・。

また、アドバイス頂いた「・・・SD直下に入れる」というのもやり方がわからず困っています。
USBメモリのように、ファイルをコピーするというものではないですよね。
初歩的なもので申し訳ございません。

いわさん

SDカードは3.3Vで利用する必要があります。
直接5Vの電圧をかけると壊れる可能性があります。
ただし通常はArduino用のSDカードモジュールは5V電圧で利用できるよう、
5V電圧を3.3Vに変換してSDカードに供給しています。
お手持ちのSDカードモジュールを確認下さい。

>「・・・SD直下に入れる」
SDカードをパソコンに接続し、SDカードドライブのルートディレクトリに
FONT.BIN、FONTLCD.BINを入れてください。

ありがとうございます!
やってみます。また報告させていただきます。

無事にできました!ありがとうございます。
マトリクスの作りが悪いのか、Arduinoから一番遠いものが点灯しなかったり、全部つきっぱなしになったりします^^;
リセットを押すとなおりますがすぐに同じ症状になります。基盤の問題かと思われますが。。。色々交換しながらやってみます。
今回は丁寧に教えていただきありがとうございましたm(_ _)m

いつも参考にさせていただいております。ありがとうございます。実は、このページにある4連8x8マトリックス2段16×16ドット表示なのですが、一度は表示できたものの、設定を変える(例えば#define BRTを0から1に変え再度コンパイラしてarduino にインストールする)と、きちんとした表示ができなくなります。UNOでもNanoでもPROminiでも症状は同じでした。だだ1日くらい電源を抜いておき、再度試すと正常に表示されるようになります。(1時間くらい電源を抜いて置いたのではうまくいきません)。ちなみにSDカードは5vで接続できるモジュールタイプを使用しています。こちらも2種類くらい変えて試しました。また電流が足りないのかも知れないと考え、Matorix とSCカートの電源は別に1Aを直にとるようにしましたが変わりません。お忙しいところ申し訳ないのですが、原因と対策などご教示いただけないかと思いメールいたしました。
実は、このmax 7219モジュールを4つつなげ、横長の16×64ドット(文字は16×16表示)の電光掲示板(用途はサッカーの文字および点数表示です)を作りたいと考えております。パラメーターをどのように変えたら良いのか、この点もお教えいただけないでしょうか?
厚かましいお願いですが、よろしくお願いいたします。

あらさん

> 1日くらい電源を抜いておき、再度試すと正常に表示されるようになります。
私も、ちょっと原因が分からないです。
症状からは、電流が流れすぎのため、Arduino UnoのポリスイッチでOFFになってしまった。
ポリスイッチの状態が戻るのに時間を要している、くらいしか思いつかないです。

実用的な実装のため、実用には耐えられないかもしれません。


> 4つつなげ、横長の16×64ドットの対応

私もやってみないと分からないですが、次の修正が必要かと思われます。

パラメータの修正
1)MAX7219_matrix.hの修正
・#define MAXSCREENS 16 // 最大接続数
2)max7219_test3.inoの修正
・#define SCREENS 16 // MAX7219カスケード接続数
・#define SC_WIDTH 64 // マトリック表示横ドット数
・関数update_screen() の修正
横64x縦16ドット表示用バッファfbuf からLEDマトリックス 16連個連結バッファptr 横128x縦8ドットへ
マッピングするように修正する必要があります。

ご返事ありがとうございます。4つ繋げるケースについては試してみたいと思います。
もう1ヶ月も同じことを試していますが、むずかしいものなのですね。
ご親切にお礼申し上げます。

あらさん
「4連8x8ドットLEDマトリックスを試してみる 続々編」にて
https://nuneno.cocolog-nifty.com/blog/2019/01/48x8led-71ac.html
横64ドットx縦16ドットをやってみました。

ご指摘の不具合については、私の環境では発生しませんでした。
輝度も問題なく設定出来ました。連続稼働、再稼働においても問題なしです。


一昨日、続々編に気がつきました。本当にありがとうございます。パラメーターなどの役割が大分わかるようになりました。この猫ちゃんサイトは素人でもわかりやすい内容なので、今後もいろいろなページをありがたく参考にさせていただきたいと考えております。
不具合については、他のケース(ESP3266なども試しています)でも書き込みする度に表示結果が異なるなど、どうもこちらのコンピュータ環境(2台ありますが、それぞれ異なった不具合があります),の問題のようです。原因はわかりませんが、机周りが乱雑なためかもしれなし、PCにいろいろなソフトを入れすぎているのかも知れません。とにかく色々きれいにから再度チャレンジしたいと考えております。
今後ともよろしくお願いいたします。

当サイトを見させていただき、LEDマトリクスに興味があったので、MAX7219のモジュールを買いました。
ひとまずテストプログラムを何も変更せずに書き込んでみたのですが、前編のモジュール一つの場合だと、文字自体は反転されず表示されるのですが、文字の配列が「さいたま」と表示されるはずが「またいさ」と表示されてしまいます。
当ページの二段の場合でも上下ではかみ合っているのですが、横向きの文字の配列が「またいさ」のように、モジュールの左から1番目~4番目ではなく4番目~1番目の順に流れています。
そのためか右スクロールや上下もうまくいかず、この場合では右半分のマスが表示されません。
ArduinoUNOを使用しMacとWindowsのどちらも同じ結果でした。

また、電車のような行先表示を作りたいのですが、2文字を表示する場合スクロールではなく、最初から固定表示するプログラムは可能でしょうか?

以上の配列エラーの解決方法と、固定表示プログラムのサンプルがありましたら、ご教授いただければと思います。
お手数をおかけしますが、よろしくお願いいたします。

りゅうさん

りゅうさんのMAX7219モジュールは、個々のLEDマトリックスの連結順番の左右が逆なのだと思われます。
1)りゅうさん [4][3][2][1]
2)当ブログ [1][2][3][4]

対策としては、データ送信の順番を入れ替えれば良いと思います。
・前記事の4連8x8ドットLEDマトリックスを試してみる
https://nuneno.cocolog-nifty.com/blog/2016/07/48x8led-0f0f.html
に添付のプログラムソースmax7219_test..zipのMAX7219_matrix.cpp内の
MAX7219_update()を修正する必要があります。


// MAX7219 全点データ送信
void MAX7219_update() {
for (byte i=0; i < 8; i++) {
digitalWrite(_load, LOW); // 送信開始
// for (byte j=0; j < _screens; j++) { // 修正前
for (int8_t j = _screens-1; j<=0; j--) { // 修正
MAX7219_write(i+1);
MAX7219_write(buf[j + (_screens * i)]);
}
digitalWrite(_load, HIGH); // データラッチ
digitalWrite(_load, LOW); // 送信終了
}
}

送信する順番を逆にします(動作は未確認)。

■最初から固定表示するプログラム
前記事のmax7219_test..zipにて
「さいたま」の表示は、スクロースせずにいきなり全部表示しています。
max7219_test.ino内のdemo1()がその処理を行っています。

LEDマトリックスの表示は次の手順で行っています。
1)LEDマトリックス表示用バッファに表示したい内容を書き込む
2)LEDマトリックス表示用バッファの内容をMAX7219モジュールに送信する

スクロース表示は、LEDマトリックス表示用バッファに1ドット横にずらした内容を
セット後、2)の送信としてMAX7219_update()を呼び出しています。

最初から固定表示を表示したい場合は、
LEDマトリックス表示用バッファにそこ固定表示の内容をセットした後に
2)の送信としてMAX7219_update()を呼び出します。

demo1()では MAX7219_getBuffer()でLEDマトリックス表示用バッファのアドレスを取得し、
表示するフォントデータを設定後、MAX7219_update()を呼び出しています。

4連LEDマトリックス表示用バッファの構造は次お通りです。
データの並びを4連LEDマトリックスの形状に合わせて並べています。


[00:1-0] [08:2-0] [16:1-0] [24:1-0]
[01:1-1] [09:2-1] [17:1-1] [25:1-1]
[02:1-2] [10:2-2] [18:1-2] [26:1-2]
[03:1-3] [11:2-3] [19:1-3] [27:1-3]
[04:1-4] [12:2-4] [20:1-4] [28:1-4]
[05:1-5] [13:2-5] [21:1-5] [29:1-5]
[06:1-6] [14:2-6] [22:1-6] [30:1-6]
[07:1-7] [15:2-7] [23:1-7] [31:1-7]

[ ]は1バイト分のデータです。[ ]内の数字は次の意味です。
[バッファ内位置:LED番号-行]
バッファ内位置がバッファ内のデータ連番、0~31の32バイト分(8x4=32)、
LED番号が8x8マトリックスの番号(1~4)、
行は、8x8マトリックスの行位置(0~7)、
[ ]は1バイト 8ビットは、1ラインの状態を保持しています。
01234567:左端ビットから右端ビットは1ラインの左端から右端に対応しています。

返信ありがとうございます。1列の方のプログラムが開かなかったので、1ヶ所のみ修正して2列の方で試してみました。
[1][2][3][4] [6][7][8][1]
[5][6][7][8]左のようにならず[2][3][4][6]
右のような出力になってしまいます。
個々のLEDマトリックスの連結順番の左右が逆というのは、このモジュールにはいくつかの種類があるということでしょうか?

りゅうさん

1列目は[1][2][3][4]と順番通りに表示されたということでしょうか?
2列目と1列目を入れ替えても同じ表示であれば、1列目と2列目のモジュールは同じ仕様の
製品だと思われます。
コメント回答は、1列版用なので2列版ではうまく動作しないかもしれません。

見た目が同じでも類似の製品を多数の中国メーカーが製造しており、
90度回転している等、色々と種類があるようです。
90度回転のものは、縦方向に複数並べて使うタイプのようです。
回路図や仕様書が無い製品は、質問して仕様を聞くか、
自分で製品を調べて仕様を把握する必要があります。

少々、高いですがサポートが充実しているとこからの購入の方が近道かもしれません。

ソリノベ研究所Yahoo!通販
https://store.shopping.yahoo.co.jp/solinnovay/rpimat832.html
ただし、上記のサイトはラズベリーパイ用のようです。


分かりづらくてすみませんでした。
[1][2][3][4] → [6][7][8][1]
[5][6][7][8] → [2][3][4][6]
4連二段の方を書き換えて右のような表示になりました。
4連一つの方も変更して確かめてみようと思います。
アマゾンで一番安いモジュールを買ってしまったので、今度はサポートのあるところで買い直して再度挑戦してみたいと思います。
ご親切に分かりやすく教えていただき、ありがとうございました。

りゅうさん

ごめんなさい、修正部分が間違ってました。
訂正しました。

モジュールを新しく購入しましたら、表示はうまく表示することが出来ました。
固定表示ですが、max7219_test.ino内のdemo1()を参考にしながら、max7219_test3.inoを下記のプログラムに変更しました。

void demo() {
uint8_t font[MAXFONTLEN];
SDfonts.open();
SDfonts.setFontSize(16);
char* str = "回送";
for (uint8_t i=0; i < SCREENS; i++) {
str = SDfonts.getFontData(font, str);
for (uint8_t j=0; j <16; j++) {
fbuf[i+j*4] = font[j];
}
}
update_screen();
delay(1000);
SDfonts.close();
}

このプログラムで試したところ、うまく表示できませんでした。
この他に変更すべき箇所やプログラムにミスがありましたら、ご教授頂ければと思います。
よろしくお願いいたします。

りゅうさん

本当は、データ構造を理解して頂けると応用が利くと思うのですが、
とりあえず修正ソースを回答します。参考にして下さい。

max7219_test3.inoに、下記のdemo1()の関数を追加、loop()を下記のものに変更で
回送、急行、埼玉を繰り返し表示するデモとなります。

void demo1(char *str) {
  uint8_t font[MAXFONTLEN];
  SDfonts.open(); 
  SDfonts.setFontSize(16); 

 for (uint8_t n=0; n<2; n++) {
   str = SDfonts.getFontData(font, str);
   for (uint8_t x= 0; x <2; x++)
     for (uint8_t y=0; y<16; y++)
         fbuf[y*4+x+n*2] = font[y*2+x];
 }
 
 update_screen();
 SDfonts.close();  
}

void loop() {
 MAX7219_clear();
 demo1("回送");
 delay(1000);
 demo1("急行");
 delay(1000);
 demo1("埼玉");
 delay(1000);
}

りゅうさん

下記の記事にて、demo1()の改良版demo2()を使ったを掲載しました。
宜しければ、参考にして下さい。
demo2()では、フォントサイズの指定等が可能です。

https://nuneno.cocolog-nifty.com/blog/2019/07/post-e09ff9.html

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 4連8x8ドットLEDマトリックスを試してみる 続編:

« 4連8x8ドットLEDマトリックスを試してみる | トップページ | IchigoJamでMAX7219 8x8ドットLEDマトリックスを制御する »