« 前ページへ - 次ページへ »
マイコンボードArduinoでLEDマトリックスのプログラムが完成したので、メモがてらその開発過程を紹介します。

Arduino入門書に掲載されている電子パーツと全く同じ型番を買ってくると、プログラミングの勉強の余地が狭まりますし、費用も割高になります。と、いうわけで、今回は一番安かったからという理由で選んだ、およそ100円のデジット(共立電子)で売っていた5x7ドットマトリックスLEDです。

どこかの記事に「5x7のドットマトリックスLEDの仕様はどれも同じ」とありましたが、一般的なデータシートを参考に配線すると表示がおかしくなったので、総当たりでピンの属性を調べなおしました。

結果はこんな感じ。XはColumn、YはRowを表し、Columnはアノード、Rowはカソードのようです。

この情報を元にArduinoへ配線をします。X方向は数が少ないのですべてアナログピン0から、y方向はデジタルピン2から1.0kΩ抵抗を介して順番につなげていきました。写真の場合、寒色系がY、暖色系がXです。

続いてプログラミングです。XがHIGHかつYがLOWのLEDが通電します。ただし、XがLOWかつYがHIGHだと逆方向に電流が流れることになりますが、今回は対策は考慮していません。

#define XNODE_0 A0
#define XNODE_LEN 5

#define YNODE_0 2
#define YNODE_LEN 7

void led(int x, int y, bool o){
  if(o == true){
    digitalWrite(XNODE_0 + x, HIGH);
    digitalWrite(YNODE_0 + y, LOW);
  }else{
     digitalWrite(XNODE_0 + x, LOW);
     digitalWrite(YNODE_0 + y, HIGH);   
  }
}
void ledOn(int x, int y){ led(x, y, true); }
void ledOff(int x, int y){ led(x, y, false); }

void setup() {
  for(int i = XNODE_0; i < XNODE_0 + XNODE_LEN; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }

  for(int i = YNODE_0; i < YNODE_0 + YNODE_LEN; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i, HIGH);
  }
}

一度に複数のLEDを表示させるには、対象のLEDを1個1個高速で順繰りに表示させるのが一般的です。列単位でまとめて処理したいところですが、電圧が一定だと、同時に点灯するとその分明るさが落ちるので、見栄えが悪くなります。

別に35バイトの配列を用意してもいいのですが、組み込みであることを意識して、マトリックスの表示データは5バイトの配列とビット演算を組み合わせてみました。
// およそ1/60sですべてのLEDを処理する
#define LED_ALL_MS (1000 * 1000 / 60)
#define LED_WAIT_MS (LED_ALL_MS / (XNODE_LEN * YNODE_LEN))

unsigned char matrix_bit[5] = {0};

void setMatrix(int x, int y, bool o){
  int pos = y * XNODE_LEN + x;
  int bytepos = pos / 8;
  int bitpos = pos % 8;
  if(o == true){
    matrix_bit[bytepos] |= (1 << bitpos);
  }else{
    matrix_bit[bytepos] &= ~(1 << bitpos);
  }
}

void clearMatrix(){
  for(int i=0;i<5;i++) matrix_bit[i] = 0;
}

void showMatrix(int interval){
  if(interval <= 0) return;
  int ms = millis();
  while(true){
    for(int y = 0; y < YNODE_LEN; y++){
      for(int x = 0; x < XNODE_LEN; x++){
        int pos =y * XNODE_LEN + x;
        int bytepos = pos / 8;
        int bitpos = pos % 8;
        bool sw = (matrix_bit[bytepos] & (1 << bitpos)) != 0;
        led(sw, x, y);
        delayMicroseconds(LED_WAIT_MS); 
        ledOff(x, y);
      }
    }
    
    int cm = millis();
    if(cm < ms || cm - ms >= interval) return;
  }
}
点灯例。指定に位置にある2つの点を交互に表示させます。
void loop() {
  clearMatrix();
  setMatrix(1, 0, true);
  setMatrix(2, 2, true);
  showMatrix(1000);

  clearMatrix();
  showMatrix(500);

  clearMatrix();
  setMatrix(3, 5, true);
  setMatrix(4, 2, true);
  showMatrix(1000);
  
  clearMatrix();
  showMatrix(500);
}
最後に文字列を表示するコードを追加してみましょう。あらかじめ用意した文字のデータをマトリックスデータにコピーするだけです。文字データはプログラムにそのまま転用できるものが見つからなかったので、海外の掲示板にあったコードを、自作のコンバーターを使って変換することにしました。
void setMatrixFromChar(char code){
  if(code < ' ') code = ' ';
  else{
    code -= ' ';
    if(code > 95) code = ' ';
  }
  for(int i =0;i<5;i++) matrix_bit[i] = chr57[code][i];
}

void showChar(char c, int interval){
  setMatrixFromChar(c);
  showMatrix(interval);
}
こちらの動画の元となった実行部分はこのようになります。コンバーターを含めたサンプルコードはこちらからどうぞ。
void loop() {
  showChar('T', 500); 
  showChar('N', 500); 
  showChar('K', 500); 
  showChar('S', 500); 
  showChar('O', 500); 
  showChar('F', 500); 
  showChar('T', 500); 
  showChar(' ', 1000); 
}
参考文献ボクのArduino工作ノート(鈴木哲哉・著)
2015年12月30日
マイクロソフトのオンラインストレージサービス「OneDrive」は有料プランとして容量無制限を提供していましたが、ごく一部のユーザーが数十TBも常時利用し、全体的なサービスへの悪影響が出たことより、無制限サービスの終了と同時に、無料ユーザーの上限を5GBに縮小することを発表しました。

しかし、10GB程度を利用しているユーザー取ってはせっせとアップロードしたデータを削除されてしまってはたまったものではありません。当然ながらマイクロソフトには批判が殺到。そのため、マイクロソフトは削減を実施する来年1月までに申請を行ったユーザーに対しては新サービス開始から提供してきた15GBとカメラサービス利用で取得したボーナス分は保護することを約束することにしました。

申請は以下のリンクから行えます。マイクソフトアカウントにログイン済みであれば、ワンクリックで終了するので、申請はお早めに。

https://preview.onedrive.com/bonus/
2015年12月13日
マウスカーソルのすぐそばでIMEが有効になっているかの状態を一目で確認できるユーティリティ「IMEステータス」のVer 2.9を公開しました。最新版では、アイコン画像をフォルダ内に個別に保存した状態でも、読み込み時に自動で連結してイメージを表示できるようになっています。また、以前に状態画面を数秒間だけ隠したいという意見がございましたが、固定時ではその画像をクリックすると5秒後にまた表示されるようになっているので、今回は変更を加えずに様子を見ています。

2015年12月12日
アニメや映画における架空の世界での金持ちは一体誰か。ギネス世界記録2016にはフォーブス誌の調査結果を基に、フィクションの世界の資産家のランキングが掲載されています。軍事産業で財をなしたアイアンマンことトニー・スタークは124億ドルと第4位。メディア王チャールズ・フォスター(市民ケーン)は112億ドルで第5位でした。第3位は300年以上も財を蓄え続けたカーライル・カレン(トワイライトシリーズ)の460億ドル。第2位はドワーフたちから強奪した金銀宝石の量の多さよりスマウグ(ホビットの冒険)の541億ドルとなりました。そして1位はなんとドナルドダックの伯父であるスクルージ・マクダック。金塊王、石油王、ダイヤモンド王である彼の資産は654億ドルでした。
2015年12月10日

TNKソフトウェアの最新作アプリ「デスクトップPCコントローラー for Windows 10」のアプリが完成しましたので、現行バージョンをβ版として配布し、希望者に無料でプレゼントするキャンペーンを行います。

「デスクトップPCコントローラー for Windows 10」はAndroidアプリ「デスクトップPCコントローラー for Windows」の後続に当たり、マウスカーソルの表示やスキンの表示位置の自在変更、マルチモニターへの対応、z値の概念など、細かい利便性の向上だけで無く、GPUエンコーディングによる高速転送や、筆圧の関知、Bluetooth接続など、ほかのリモートデスクトップには無いユニークな機能を提供しております。



キャンペーンに参加される方は2015年12月25日までにdeskpcwin10@tnksoft.comまでメールをお送りください。空メールでもかまいませんが、このキャンペーンはアプリに問題が無いかの最終チェックも兼ねておりますので、どのような用途で利用するかなど、β版の継続的な利用に繋がるコメントが記述されている方に優先的に招待状をお送りします。ダウンロードされたアプリは正式版でもアップデートの対象になり、このときの費用は不要です。

募集数は50人ほどを予定しており、採用された方には順次、メールに使用されたアドレス宛に、ウィンドウズストアアプリでアプリをダウンロードするための招待状をお送りします。招待状を受け取られた方は記載の内容に従い、ウィンドウズストアアプリでプロモーションコードを入力してください。

ストアアプリのβ版はWindows 10(32bit / 64bit)でのみダウンロード可能です。正式版はWindows 8.1やAndroidもサポートする予定です。
2015年12月8日
キノコの一種であるアミガサダケはフランスでは高級食材としても利用される一方、ジロミトリンと呼ばれる毒を保有しているため、食用を禁じている国もあります。

この毒物は茹でることを繰り返すことで除去することができるのですが、この過程で発生するモノメチルヒドラジンは揮発性が極めて高く、酸化窒素と爆発的に反応するため、かつてはロケットの推進剤に用いられていたとのことです。しかしながら、事故が発生すると毒ガスがまき散らされることになるため、現在では使われることは無いそうです。

出典:講談社スターバックス「化学トリック=だまされまいぞ!
2015年12月7日
今日限りですがポイント還元でもいいのならヤフーショッピングで5000ポイント+αほどもらえるみたいですね。ソフトバンク日本一セールの時よりも還元率が高くて、勢いで買ったのを少し後悔。
 | 2015年11月11日
神道が中心だった日本に仏教が入ってきても宗教間のいざこざが起きなかったのは聖徳太子が上手く取り持ったからって言う説がある。これに失敗してたら今頃互いに殴り合っていたかもしれない。
ちなみにこの国は宗教世界における永世中立国だよ。 あらゆる教義を日本に入ってきた瞬間に 「うんうん、それも八百万だね」 という言葉で殴り倒し、あらゆる宗教の争いを許さない。 おかげで世界で唯一ユダヤ教徒とイスラム教徒が結婚して住める国になってしまった。
 | 2015年11月10日
男は格子状の鉄製のふたを外して中に入って寝転び、ふたの下から路上を歩く女性の姿を見ていたという:道路の側溝に潜み、スカート内のぞき見 容疑で男逮捕 #Yahooニュース
男は格子状の鉄製のふたを外して中に入って寝転び、ふたの下から路上を歩く女性の姿を見ていたという:道路の側溝に潜み、スカート内のぞき見 容疑で男逮捕 #Yahooニュース
 | 2015年11月9日
ベクターのオンラインショップでは期間限定でセキュリティーソフト「ESET FAMILY SECURITY」と年賀状作成に機能を絞った「筆まめSelect2016」のセットが5280円で販売中です。ESETは3年間の利用が可能でWindows/Mac/Androidの中から5台の端末にインストールができるパックセットなので、これだけでも十分お買い得です。



2015年11月6日
« 前ページへ - 次ページへ »