LEDマトリクスでの複数パターン点灯

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
uuu

LEDマトリクスでの複数パターン点灯

#1

投稿記事 by uuu » 8年前

mbedとLEDマトリクスを使って、複数のパターンを順に点灯させたいのですが
どのようにプログラムを組めばよいか全く分からず、教えて頂けないでしょうか。
現状、1パターンを点灯させる事はできましたが、次の別パターンに移るところで
躓いています。

コード:

#include "mbed.h"

Ticker flipper;
BusOut Col(dp3,dp6,dp7,dp8,dp9,dp10,dp11,dp12);
BusOut Row(dp15,dp16,dp17,dp18,dp19,dp20,dp21,dp22);

const uint8_t pt[8] = {0x80,0x10,0x44,0x20,0x04,0x90,0x08,0x00};

void flip()
{
    static int col = 0;

    Row = 0;
    Col = pt[col];
    Row = 1 << col;
    
    col++;
    col %=8;
}


int main()
{
    flipper.attach(&flip,0.02); 

   while(1) {
    }
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: LEDマトリクスでの複数パターン点灯

#2

投稿記事 by みけCAT » 8年前

適当なタイミングでパターンを切り替えるようにプログラムを組めばいいと思います。
例えばこんな感じでしょうか?
(コンパイル・テストしていません)

コード:

#include "mbed.h"

Ticker flipper;
BusOut Col(dp3,dp6,dp7,dp8,dp9,dp10,dp11,dp12);
BusOut Row(dp15,dp16,dp17,dp18,dp19,dp20,dp21,dp22);

const uint8_t pt[][8] = {
    {0x80,0x10,0x44,0x20,0x04,0x90,0x08,0x00}, // パターン1
    {0x44,0x20,0x04,0x90,0x08,0x00,0x80,0x10}, // パターン2
    {0x04,0x90,0x08,0x00,0x80,0x10,0x44,0x20}, // パターン3
    {0x08,0x00,0x80,0x10,0x44,0x20,0x04,0x90}  // パターン4
};

void flip()
{
    static int col = 0;
    static int puttern = 0; // 表示するパターン
    static int change = 50; // あと何回処理をしたらパターンを切り替えるか

    Row = 0;
    Col = pt[puttern][col];
    Row = 1 << col;
    
    col++;
    col %= 8;

    change--;
    if(change <= 0) {
        // パターンを切り替える
        puttern++;
        puttern %= sizeof(pt) / sizeof(*pt);
        // 次に切り替えるまでの処理回数をセットする
        change = 50;
    }
}


int main()
{
    flipper.attach(&flip,0.02); 

    while(1) {
    }
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

uuu

Re: LEDマトリクスでの複数パターン点灯

#3

投稿記事 by uuu » 8年前

さっそく回答いただきありがとうございます!
教えて頂いた方法で、うまくできました!
1つ質問ですが、プログラムの中で

// パターンを切り替える
puttern++;
puttern %= sizeof(pt) / sizeof(*pt);

となってますが、なぜ 「puttern++;」 だけではダメなのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: LEDマトリクスでの複数パターン点灯

#4

投稿記事 by みけCAT » 8年前

uuu さんが書きました:なぜ 「puttern++;」 だけではダメなのでしょうか?
puttern++;だけだと、切り替えを続けると読み込み元が有効なデータのないところになってしまい、おかしなことになってしまうので、
読み込み元を戻すか止めるかする必要かあるからです。
今回は戻す実装にしてみました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

uuu

Re: LEDマトリクスでの複数パターン点灯

#5

投稿記事 by uuu » 8年前

複数のパターンを点灯することはできましたが、これをさらに変更し
最後の列(下記、パターン25~27)で照明の明るさを落とすといった処理をするには
どのようなプログラムにすれば良いのでしょうか?ご教授の程、よろしくお願いいたします。

コード:

#include "mbed.h"

Ticker flipper;
BusOut Col(dp3,dp6,dp7,dp8,dp9,dp10,dp11,dp12);
BusOut Row(dp15,dp16,dp17,dp18,dp19,dp20,dp21,dp22);


void flip()
{
    uint8_t pt[][8] = {
    {0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, //パターン1
    {0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00}, //パターン2
    {0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00}, //パターン3
    {0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00}, //パターン4
    {0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00}, //パターン5
    {0x00,0x40,0x40,0x40,0x00,0x00,0x00,0x00}, //パターン6
    {0x00,0x00,0x40,0x40,0x40,0x00,0x00,0x00}, //パターン7
    {0x40,0x00,0x00,0x40,0x40,0x40,0x00,0x00}, //パターン8
    {0x00,0x40,0x00,0x00,0x40,0x40,0x40,0x00}, //パターン9
    {0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x40}, //パターン10
    {0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x40}, //パターン11
    {0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,}, //パターン12
    {0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,}, //パターン13
    {0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,}, //パターン14
    {0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x40,}, //パターン15
    {0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,}, //パターン16
    {0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,}, //パターン17
    {0x00,0x08,0x08,0x08,0x00,0x00,0x00,0x00,}, //パターン18
    {0x00,0x00,0x08,0x08,0x08,0x00,0x00,0x00,}, //パターン19
    {0x08,0x00,0x00,0x08,0x08,0x08,0x00,0x00,}, //パターン20
    {0x00,0x08,0x00,0x00,0x08,0x08,0x08,0x00,}, //パターン21
    {0x00,0x00,0x08,0x00,0x00,0x08,0x08,0x08,}, //パターン22
    {0x00,0x00,0x00,0x08,0x00,0x00,0x08,0x08,}, //パターン23
    {0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x08,}, //パターン24
    {0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,}, //パターン25
    {0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,}, //パターン26
    {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,}, //パターン27
};

    static int col = 0;
    static int puttern = 0;
    static int change = 0;

    Row = 0;
    Col = pt[puttern][col];
    Row = 1 << col;
    
    col++;
    col %=8;

change--;
    if(change <= 0) {
        
        // パターンを切り替える
        puttern++;
        puttern %= sizeof(pt) / sizeof(*pt);
        
        // 次に切り替えるまでの処理回数をセットする
        change = 100;
    }
}

int main()
{
    flipper.attach(&flip,0.002); 

   while(1) {
    }
}


あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: LEDマトリクスでの複数パターン点灯

#6

投稿記事 by あんどーなつ » 8年前

ここの住人は基本的にWin屋だから答えづらいと思います。
Col, Rowに8chづつ接続しているみたいですけど、LEDは64個ありますか?
マイコンのチップ名と、LEDデバイスの型名を教えていただけると何とかできるかもしれないのですが...

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: LEDマトリクスでの複数パターン点灯

#7

投稿記事 by みけCAT » 8年前

uuu さんが書きました:最後の列(下記、パターン25~27)で照明の明るさを落とすといった処理をするには
どのようなプログラムにすれば良いのでしょうか?
具体的な実装は後で考えたいと思いますが、
照明の明るさを落とすにはPWMみたいに一部の点灯させるタイミングで点灯させない(点灯を間引く)ようにするとよさそうだと思います。
点灯パターンのデータに明るさのデータを加えるべきかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

uuu

Re: LEDマトリクスでの複数パターン点灯

#8

投稿記事 by uuu » 8年前

あんどーなつ様

コメントありがとうございます。
LEDは64個あります。
マイコンのチップ名;mbed LPC824 - スイッチサイエンス
LEDデバイスの型名;赤色ドットマトリクスLED 8x8ドット OSL641501-ARA

以上になりますが、分かりますでしょうか?

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: LEDマトリクスでの複数パターン点灯

#9

投稿記事 by あんどーなつ » 8年前

Row, Colともに1で点灯ですね。山勘で書いてみました。
これで動いてくれると嬉しいのですが・・・

コード:

#include "mbed.h"
 
Ticker flipper;
BusOut Col(dp3,dp6,dp7,dp8,dp9,dp10,dp11,dp12);
BusOut Row(dp15,dp16,dp17,dp18,dp19,dp20,dp21,dp22);
 
uint8_t div[8] = {7, 3, 5, 1, 6, 2, 4, 0};
 
uint8_t pt[][9] = {
    {0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 8}, //パターン1
    {0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 8}, //パターン2
    {0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 8}, //パターン3
    {0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, 8}, //パターン4
    {0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00, 8}, //パターン5
    {0x00,0x40,0x40,0x40,0x00,0x00,0x00,0x00, 8}, //パターン6
    {0x00,0x00,0x40,0x40,0x40,0x00,0x00,0x00, 8}, //パターン7
    {0x40,0x00,0x00,0x40,0x40,0x40,0x00,0x00, 8}, //パターン8
    {0x00,0x40,0x00,0x00,0x40,0x40,0x40,0x00, 8}, //パターン9
    {0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x40, 8}, //パターン10
    {0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x40, 8}, //パターン11
    {0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40, 8}, //パターン12
    {0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 8}, //パターン13
    {0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, 8}, //パターン14
    {0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x40, 8}, //パターン15
    {0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 8}, //パターン16
    {0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, 8}, //パターン17
    {0x00,0x08,0x08,0x08,0x00,0x00,0x00,0x00, 8}, //パターン18
    {0x00,0x00,0x08,0x08,0x08,0x00,0x00,0x00, 8}, //パターン19
    {0x08,0x00,0x00,0x08,0x08,0x08,0x00,0x00, 8}, //パターン20
    {0x00,0x08,0x00,0x00,0x08,0x08,0x08,0x00, 8}, //パターン21
    {0x00,0x00,0x08,0x00,0x00,0x08,0x08,0x08, 8}, //パターン22
    {0x00,0x00,0x00,0x08,0x00,0x00,0x08,0x08, 8}, //パターン23
    {0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x08, 8}, //パターン24
    {0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00, 4}, //パターン25
    {0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00, 4}, //パターン26
    {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08, 4}, //パターン27
};
 
void flip()
{
    static int col = 0;
    static int puttern = 0;
    static int change = 0;
 
    Row = 0;
    Col = (div[change % 8] < pt[puttern][8]) ? pt[puttern][col] : 0;
    Row = 1 << col;
    
    col++;
    col %=8;
 
	change--;
    if(change <= 0) {
        
    	// パターンを切り替える
    	puttern++;
    	puttern %= sizeof(pt) / sizeof(*pt);
                
    	// 次に切り替えるまでの処理回数をセットする
    	change = 100;
    }
}
 
int main()
{
    flipper.attach(&flip,0.002); 
 
   while(1) {
    }
}

uuu

Re: LEDマトリクスでの複数パターン点灯

#10

投稿記事 by uuu » 8年前

あんどーなつ様

残念ながらコンパイルエラーが出てしましました

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: LEDマトリクスでの複数パターン点灯

#11

投稿記事 by あんどーなつ » 8年前

ビルドチェックくらいすべきでした。divをdiv1に変えています。
オフトピック
mbedはローカルにインストールしなくてもIDEが使えるようです。さすが21世紀!!
► スポイラーを表示

uuu

Re: LEDマトリクスでの複数パターン点灯

#12

投稿記事 by uuu » 8年前

あんどーなつ様

ありがとうございます。
作動しました。
が、プログラムの意図が理解できず申し訳ありませんが
解説していただけないでしょうか

特に下記の部分が分かりません

Row = 0;
Col = (div1[change % 8] < pt[puttern][8]) ? pt[puttern][col] : 0;
Row = 1 << col;

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: LEDマトリクスでの複数パターン点灯

#13

投稿記事 by あんどーなつ » 8年前

Col = (div1[change % 8] < pt[puttern][8]) ? pt[puttern][col] : 0;の意味ですが、

まず、div1[change % 8]で0~7の間で散らばるような数列を作ります。changeは100から始まるので、数列は、
6, 1, 5, 3, 7, 0, 4, 2, 6, 1, 5, 3, 7, 0, 4, 2, ...
のようになります。

次に、各パターンで設定している照度(0~8)と数列を比較します。
照度8の場合、 T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, ...
照度4の場合、 F, T, F, T, F, T, F, T, F, T, F, T, F, T, F, T, ...
照度2の場合、 F, T, F, F, F, T, F, F, F, T, F, F, F, T, F, F, ...
照度0の場合、 F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, ...
となります(TはTRUE, FはFALSE)。

最後に、元の点滅アルゴリズムと0と選択させています。これによって、各LEDの通電時間を(照度/8)に抑えています。


ちなみに今気づいたことなんですけど、LEDパタンは

コード:

00000000
00011000
00100100
01000010
01000010
00100100
00011000
00000000
みたいな感じじゃなくて、

コード:

00110100
00110100
00110100
00110100
00110100
00110100
00110100
00110100
みたいな感じになっていませんか?もしなっていたら、直させてください。

uuu

Re: LEDマトリクスでの複数パターン点灯

#14

投稿記事 by uuu » 8年前

あんどーなつ様

何度も申し訳ないですが、下記構文の意味(意図)も理解できません
ご教授お願いいたします。

uint8_t div1[8] = {7, 3, 5, 1, 6, 2, 4, 0};

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: LEDマトリクスでの複数パターン点灯

#15

投稿記事 by あんどーなつ » 8年前

uuu さんが書きました: uint8_t div1[8] = {7, 3, 5, 1, 6, 2, 4, 0};
の意図は、私が書いた投稿で、「散らばるような数列」を作るという話をしたのですが、それを作るための配列です。
あんどーなつ さんが書きました: まず、div1[change % 8]で0~7の間で散らばるような数列を作ります。changeは100から始まるので、数列は、
6, 1, 5, 3, 7, 0, 4, 2, 6, 1, 5, 3, 7, 0, 4, 2, ...
のようになります。

次に、各パターンで設定している照度(0~8)と数列を比較します。
照度8の場合、 T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, ...
照度4の場合、 F, T, F, T, F, T, F, T, F, T, F, T, F, T, F, T, ...
照度2の場合、 F, T, F, F, F, T, F, F, F, T, F, F, F, T, F, F, ...
照度0の場合、 F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, ...
となります(TはTRUE, FはFALSE)。
この時の点滅パタンは次のようになります。

コード:

照度 100% : 1111111111111111
照度  50% : 1010101010101010
照度  25% : 1000100010001000
照度   0% : 0000000000000000

実は今回の場合、コードを次のように書き換えても動作するのではないかと、後で気づいたのですが、

コード:

uint8_t div1[8] = {7, 6, 5, 4, 3, 2, 1, 0};
このようにすると、点滅パタンは

コード:

照度 100% : 1111111111111111
照度  50% : 1111000011110000
照度  25% : 1100000011000000
照度   0% : 0000000000000000
のように変わります。ただ、各LEDに流している電流の波形は、

コード:

0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
1111000011110000111100001111000011110000111100001111000011110000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
...
0000000000000000000000000000000000000000000000000000000000000000
というように、0固定の区間が異様に長いので、照度50%のときに00001111だろうと01010101だろうとあまり変わらないです。なので、div1が73516240でも76543210でもいいです。

大事なのは、
duty(デューティ) = (1の数) / (0の数 + 1の数) = 照度(0~8) / 8
という関係が守れているかということです。

uuu

Re: LEDマトリクスでの複数パターン点灯

#16

投稿記事 by uuu » 8年前

あんどーなつ様

ご丁寧な回答、ありがとうございます。
下記のように、照度を変更してみましたが、特に明るさは変わらないように思われますが
原因は分かりますでしょうか。

コード:

    {0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00, 0}, //パターン25
    {0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00, 0}, //パターン26
    {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08, 0}, //パターン27

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: LEDマトリクスでの複数パターン点灯

#17

投稿記事 by あんどーなつ » 8年前

上がっているコードだけで話をすると、1パターンあたり0.2秒で切り替わっているためと思います。パターン25~27で0.6秒になります。

uuu

Re: LEDマトリクスでの複数パターン点灯

#18

投稿記事 by uuu » 8年前

あんどーなつ様
あんどーなつ さんが書きました:上がっているコードだけで話をすると、1パターンあたり0.2秒で切り替わっているためと思います。パターン25~27で0.6秒になります。
現状のコードですと、すべて0.2秒ごとに切り替わってしまいますが、例えばパターン25~27だけ切替時間を変えるという事は可能でしょうか。

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: LEDマトリクスでの複数パターン点灯

#19

投稿記事 by あんどーなつ » 8年前

change = 100; と書いているところで、
if (puttern <= 23) change = 100;
else change = 1000;
と書くと、パターン25~27で0.2秒が2秒になります。

Cの配列は0始まりなので、このバージョンだとコメントとコードで1つずつずれます。
コメントを1じゃなくて0から始めるか、ダミーデータ(パターン0)を追加すれば、わかりやすくなります。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: LEDマトリクスでの複数パターン点灯

#20

投稿記事 by みけCAT » 8年前

uuu さんが書きました:例えばパターン25~27だけ切替時間を変えるという事は可能でしょうか。
切り替え時間もデータに入れればできそうな気がします。
► スポイラーを表示
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

uuu

Re: LEDマトリクスでの複数パターン点灯

#21

投稿記事 by uuu » 8年前

何度も聞いてすいませんが、下記の
パターン1から3を順番に点灯するのを100回繰り返す動作を実行したあと
パターン4から6を同じく順番に点灯し100回繰り返したい場合はどのようなプログラムになりますでしょうか

コード:

#include "mbed.h"
 
Ticker flipper;
BusOut Col(dp3,dp6,dp7,dp8,dp9,dp10,dp11,dp12);
BusOut Row(dp15,dp16,dp17,dp18,dp19,dp20,dp21,dp22);
 
int select;
 
void flip()
{
    uint8_t pt[][8] = {
    {0x90,0x94,0xA4,0x24,0x28,0x48,0x48,0x50}, //パターン1
    {0x00,0x00,0x80,0x04,0x20,0x00,0x08,0x50}, //パターン2
    {0x00,0x80,0x84,0x24,0x20,0x08,0x58,0x50}, //パターン3
};
    static int col = 0;
    static int puttern = 0;
    static int change = 0;
 
    Row = 0;
    Col = pt[puttern][col];
    Row = 1 << col;
    
    col++;
    col %=8;
    
change--;
    if(change <= 0) {        
        // パターン9まで行ったら実行する関数を切り替える
        if(puttern == 2) select = 1;        
        // パターンを切り替える
        puttern++;
        puttern %= sizeof(pt) / sizeof(*pt);        
        // 次に切り替えるまでの処理回数をセットする
        change = 1;
    }
}    
 
void flip2()
{
    uint8_t pt[][8] = {
    {0x48,0x50,0x90,0x94,0xA4,0x24,0x28,0x48}, //パターン4
    {0x08,0x40,0x00,0x00,0x80,0x04,0x20,0x00}, //パターン5
    {0x48,0x40,0x00,0x80,0x84,0x24,0x20,0x08}, //パターン6
};
    static int col = 0;
    static int puttern = 0;
    static int change = 0;
 
    Row = 0;
    Col = pt[puttern][col];
    Row = 1 << col;
    
    col++;
    col %=8;
    
change--;
    if(change <= 0) {
        

        // 最後のパターンまで行ったら実行する関数を切り替える
        if(puttern == (int)(sizeof(pt)/sizeof(*pt) - 1)) select = 0;
        
        // パターンを切り替える
        puttern++;
        puttern %= sizeof(pt) / sizeof(*pt);
        
        // 次に切り替えるまでの処理回数をセットする
        change = 1;
    }
}
 
void flipSelector()
{
    switch(select) {
        case 0: flip(); break;
        case 1: flip2(); break;
    }
}
 
int main()
{
    select = 0;
    flipper.attach(&flipSelector,0.002);
    
   while(1) {
    }
}


アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: LEDマトリクスでの複数パターン点灯

#22

投稿記事 by みけCAT » 8年前

uuu さんが書きました:下記の
パターン1から3を順番に点灯するのを100回繰り返す動作を実行したあと
パターン4から6を同じく順番に点灯し100回繰り返したい場合はどのようなプログラムになりますでしょうか
スクリプトのようなものを実行できるようにするといいでしょう。

コード:

#include "mbed.h"

Ticker flipper;
BusOut Col(dp3,dp6,dp7,dp8,dp9,dp10,dp11,dp12);
BusOut Row(dp15,dp16,dp17,dp18,dp19,dp20,dp21,dp22);

void flip()
{
    static uint8_t pt[][9] = {
        {1, 100},
        {0, 0x90,0x94,0xA4,0x24,0x28,0x48,0x48,0x50}, //パターン1
        {0, 0x00,0x00,0x80,0x04,0x20,0x00,0x08,0x50}, //パターン2
        {0, 0x00,0x80,0x84,0x24,0x20,0x08,0x58,0x50}, //パターン3
        {2},
        {1, 100},
        {0, 0x48,0x50,0x90,0x94,0xA4,0x24,0x28,0x48}, //パターン4
        {0, 0x08,0x40,0x00,0x00,0x80,0x04,0x20,0x00}, //パターン5
        {0, 0x48,0x40,0x00,0x80,0x84,0x24,0x20,0x08}, //パターン6
        {2}
    };

    static int loopStart = 0;
    static int loopCount = 0;
    static int col = 0;
    static int puttern = 0;
    static int pc = 0;
    static int change = 0;
 
    if(change <= 0) {
        // スクリプトの処理を行う
        puttern = -1;
        do {
            switch (pt[pc][0]) {
                case 0: // 0: 点灯パターン設定
                    puttern = pc;
                    break;
                case 1: // 1: ループ始点
                    loopStart = pc;
                    loopCount = pt[pc][1];
                    break;
                case 2: // 2 : ループ終点
                    loopCount--;
                    if (loopCount > 0) pc = loopStart;
                    break;
            }
            // 次に進む
            pc = (pc + 1) % (sizeof(pt) / sizeof(*pt));
        } while (puttern < 0); // 次の点灯パターンが決まるまで実行を続ける
        // 次に切り替えるまでの処理回数をセットする
        change = 1;
    }
    
    Row = 0;
    Col = pt[puttern][col + 1];
    Row = 1 << col;
    
    col++;
    col %=8;
    
    change--;
}

int main()
{
    flipper.attach(&flip,0.002);
    
    while(1) {
    }
}
0 : 点灯パターンの設定 (後ろ8個でパターンを指定)
1 : ループ開始 (後ろ1個にループする回数を指定)
2 : ループ終了

このバージョンではループはネストできません。 (スタックを使ってネストできるようにすることもできるでしょう)
輝度や1パターンあたりの表示時間を設定するコマンドを追加してもいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

uuu

Re: LEDマトリクスでの複数パターン点灯

#23

投稿記事 by uuu » 8年前

みけCAT様

ありがとうございます。動きましたが、行列が入れ替わってしまった様なのですが
(点灯パターンの切り替わる方向が変わってしまった)
対策わかりますでしょうか。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: LEDマトリクスでの複数パターン点灯

#24

投稿記事 by みけCAT » 8年前

uuu さんが書きました:動きましたが、行列が入れ替わってしまった様なのですが
(点灯パターンの切り替わる方向が変わってしまった)
切り替わる方向、とはどういうことでしょうか?
具体的にどのような動作(putternとcolの関係)をさせたいのでしょうか?
オフトピック
1回→100回にすることでパターンは当然変わることが予想されます。
まさかとは思いますが、正解のプログラムは作っているけどわざとわからないふりをして出題している、ということは無いですよね?
とりあえず、2個の関数にある2個のcolを1個にしたことで確かに動作は変わってしまうので、対症療法としてcolと「影のcol」を入れ替えるコマンドを用意しました。

コード:

#include "mbed.h"

Ticker flipper;
BusOut Col(dp3,dp6,dp7,dp8,dp9,dp10,dp11,dp12);
BusOut Row(dp15,dp16,dp17,dp18,dp19,dp20,dp21,dp22);

void flip()
{
    static uint8_t pt[][9] = {
        {1, 100},
        {0, 0x90,0x94,0xA4,0x24,0x28,0x48,0x48,0x50}, //パターン1
        {0, 0x00,0x00,0x80,0x04,0x20,0x00,0x08,0x50}, //パターン2
        {0, 0x00,0x80,0x84,0x24,0x20,0x08,0x58,0x50}, //パターン3
        {2},
        {3},
        {1, 100},
        {0, 0x48,0x50,0x90,0x94,0xA4,0x24,0x28,0x48}, //パターン4
        {0, 0x08,0x40,0x00,0x00,0x80,0x04,0x20,0x00}, //パターン5
        {0, 0x48,0x40,0x00,0x80,0x84,0x24,0x20,0x08}, //パターン6
        {2},
        {3}
    };

    static int loopStart = 0;
    static int loopCount = 0;
    static int col = 0, colBack = 0;
    static int puttern = 0;
    static int pc = 0;
    static int change = 0;
 
    if(change <= 0) {
        // スクリプトの処理を行う
        puttern = -1;
        do {
            switch (pt[pc][0]) {
                case 0: // 0: 点灯パターン設定
                    puttern = pc;
                    break;
                case 1: // 1: ループ始点
                    loopStart = pc;
                    loopCount = pt[pc][1];
                    break;
                case 2: // 2 : ループ終点
                    loopCount--;
                    if (loopCount > 0) pc = loopStart;
                    break;
                case 3: // 3: col入れ替え
                    {
                        int temp = col;
                        col = colBack;
                        colBack = temp;
                    }
                    break;
            }
            // 次に進む
            pc = (pc + 1) % (sizeof(pt) / sizeof(*pt));
        } while (puttern < 0); // 次の点灯パターンが決まるまで実行を続ける
        // 次に切り替えるまでの処理回数をセットする
        change = 1;
    }
    
    Row = 0;
    Col = pt[puttern][col + 1];
    Row = 1 << col;
    
    col++;
    col %=8;
    
    change--;
}

int main()
{
    flipper.attach(&flip,0.002);
    
    while(1) {
    }
}
以下のカウンタを用いて関数を切り替えるプログラムと(処理時間の影響で短い時間ずれるかもしれないが、ほぼ)同じ出力になるはずだと思います。
► スポイラーを表示
ついでに、自分はここで使われているマイコンの環境を用意していないので、テストに用いている「普通の」環境で動くコードも載せておきます。

スクリプト版
► スポイラーを表示
関数切り替え版
► スポイラーを表示
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

uuu

Re: LEDマトリクスでの複数パターン点灯

#25

投稿記事 by uuu » 8年前

みけCAT様
返信ありがとうございます
切り替わる方向、とはどういうことでしょうか?
具体的にどのような動作(putternとcolの関係)をさせたいのでしょうか?
下図になりますが、伝わりますでしょうか。
8×8のLEDマトリクスを光らせ、雫が落ちる動きを表現したいです
そのためにRow方向に向かって点灯位置をずらし、落ちているように見せる狙いです。
参考にしている回路図も載せます。

   col→
Row  ○○○○○○○○
 ↓   ○○○○○○○○
    ○○○○○○○○
    ○○○○○○○○
    ○○○○○○○○
    ・    
    ・
    ・

画像
まさかとは思いますが、正解のプログラムは作っているけどわざとわからないふりをして出題している、ということは無いですよね?
とんでもございません。私、今回初めてC言語を扱いますので、全くの初心者です。

閉鎖

“C言語何でも質問掲示板” へ戻る