コントローラ基盤 Vol.2 ― 2014年11月01日
ちょっと、光もので遊んでいます。
aitendoで見つけたI2C接続のLEDコントローラドライバ[HT16K33-28W] を使ったモジュールを作成するためのICと基板の2点セットです。
アノード側(ROW0~ROW15)16ビット、カソード側(COM0~COM7)8ビットのLEDコントローラーです。8x8matrixLEDなら2個までコントロールできます。7セグLEDや14セグLEDもコントロール可能(カソードコモン)です。使用しているコントローラーICはHOLTEK社のHT16K33というICです。このコントローラは16x8ビットRAMデータストレージを持っていますのでI2Cへはアドレスデータ(通常00H)、16ビット表示データ(通常8行分)、表示コマンドの順にデータを送信することで表示を行います。adafruitからはHT16K33を使用した8x8 matrix LEDや7セグLED、Dual Alphanumeric Displayを表示させる基板がいくつか発売されています。国内ではスイッチサイエンスで取り扱いがあります。コントローラー基板は秋月でも扱っいます。
MPUとはI2C接続です。ArduinoやRaspberry PiとI2Cバス接続して使用することができます。Arduinoライブラリーも公開されています。
Adafruit-LED-Backpack-Library
Adafruit-GFX-Library
コントローラ基盤 Vol.2-1 ― 2014年11月01日
コントローラ基盤 Vol.2-2 ― 2014年11月01日
MAX7219と8x8matrix LED
aitendoで見つけた8x8マトリックスモジュールです。税別495円です。パーツを買うより安かったので買ってしまいました。
外部との接続インターフェースはSPI接続です。Arduino ライブラリーではMatrix LEDのライブラリーが多数掲載されています。使いやすいものを使用すると良いでしょう。
このあたりのライブラリーが使用できます。
コントローラ基盤 Vol.3 ― 2014年11月09日
Arduinoで7セグLEDコントローラを作成
7segduinoなるページを見つけました。これなら部品があるじゃないですか。というわけで早速作成しました。クリスタルは使用せずに8MHz内蔵CR発信で部品数を減らしています。実はこの7segduinoクローンの作成がここのところいろいろやっている光りものコントローラシリーズを始めるきっかけになりました。
外部との接続インターフェースはシリアル(左側)とI2C(右側)を引き出してあります。ファームウエアにはHT16K33に似たプロトコルを採用しました。16バイトまでのデータを受け取り、表示コマンドで表示します。4バイト以上の場合は右からスクロールします。
- コントローラ
ATmega328P Arduino クローン
ATmegaBOOT_168_atmega328_pro_8MHz.hex - 7セグメント 4桁LED
秋月電子のダイナミック接続4桁高輝度白色7セグメントLED表示器
7segduinoのデモスケッチにI2C スレーブ機能を追加しました。I2Cマスターからの書き込み要求(R/W=0)を受け取り、7セグ表示データ(数値や文字ではありません。)をバッファーに格納します。Loop関数内ではバッファーを7セグLEDに表示させています。改良の余地だらけないい加減なプログラムです。特にスクロール表示中にデータが書き換わってもそのまま表示しています。
// --------------------------- // 7segduino I2C Slave Firmware // --------------------------- #include <Sseg.h> #include <Wire.h> Sseg mySseg = Sseg(4, 8, 11, 13, 14, 2, 10, 12, 3, 6, 7, 9); // Initial data uint8_t strbuf[] = { 0b00000000, 0b00000000, 0b00000000, 0b00000000, // Buffer MAX 16 character 0b01101110, // H 0b10011110, // E 0b00011100, // L 0b00011100, // L 0b00111010, // o 0b00000000, // NUM_PAT_7, // 7 0b10110110, // S NUM_PAT_E, // E 0b11110110, // G 0b00000001, // . 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111 }; int buflen = 15; // Initial buffer length. int cntstr = 4; // Initial buffer position. int p = 0; // Display position. // I2C data Protocol // 1 2 3 4 5 6 7 8 9 10 11 12 13 // "H" "e" "l" "l" "o" "W" "o" "r" "l" "d" "!" "!" 0xFF // MAX 16 characters void hreceive(int numBytes) { for(int i = 0; i < numBytes; i++){ strbuf[cntstr] = Wire.read(); if(cntstr == 4) buflen = 4; if(strbuf[cntstr] != 0xFF) ++buflen; if(cntstr > 18 || strbuf[cntstr] == 0xFF) { cntstr = 4; // Return to home position. } else { ++cntstr; } } } void setup() { mySseg.begin(); mySseg.setBrightness(20); Wire.begin(8); Wire.onReceive(hreceive); } #define OVERWRAP(a, x) (((x) < buflen) ? (a[(x)]) : a[((x) - buflen)]) void loop() { if ((++p) > buflen) { if(buflen > 8) { p = 0; // scroll } } if(buflen > 8) { mySseg.writeRawData( OVERWRAP(strbuf, p), OVERWRAP(strbuf, p+1), OVERWRAP(strbuf, p+2), OVERWRAP(strbuf, p+3)); mySseg.updateWithDelay(300); } else { p = 4 - (8 - buflen); // Not scroll mySseg.writeRawData( strbuf[ p], strbuf[p+1], strbuf[p+2], strbuf[p+3]); mySseg.updateWithDelay(50); } }
使用したArduino IDEのバージョンは1.0.6です。
ソースプログラム中のカギ括弧にご注意ください。HTMLのタグとの区別ため一部に全角文字を使用しています。Arduino IDEの置換え機能で半角に変換してからコンパルしてください。
ArduinoでFelicaリーダー ― 2014年11月14日
FelicaカードのIDmと残高表示
ArduinoボードにはATmega32U2を使用したArduino Leonardo互換ボードを使用しています。USB内蔵タイプはシリアルポートが空いているのでスケッチの更新のたびにRC-S620/Sを外さなくて済みますし、読み取ったIDmやカード・残高をキー入力としてPCに送ることも出来ます。
- コントローラ
ATmega32U2 Arduino Leonardoクローン
Caterina-Minimus.hex - Felicaリーダー RC-S620/S
ソニーのFelicaリーダー。Arduino向けRC-S620/S制御ライブラリを使用しました。
USB内蔵タイプのMPUはシリアルポートが異なりますのでRCS620S.cppを直接修正しました。
【プログラム】
「FeliCa電子マネー残高照会機モドキ」のブログで紹介されています。残高照会の部分はそののまま使用させていただきました。FelicaカードのHackはこのサイトで紹介されています。IDmの読み出しの部分はRC-S620/Sライブラリーのサンプルプログラムを使用しました。
デジタルピン5、6にそれぞれスイッチを接続しています。ピン5はUSBキー出力のON/OFFスイッチで、ピン6はIDm読み出し/残高照会の切り替えスイッチです。
// Felica caed reader 2014/11/14 // Read out the card history by RC-S620/S. // Corresponding to PASSNET, Edy, nanaco and waon. // MPU: ATmega32U2 + Caterina-Minimus.hex // Sample program site. // http://www.orsx.net/blog/archives/3835 // Felica card informations. // http://sourceforge.jp/projects/felicalib/wiki/FrontPage // #include <LiquidCrystal.h> #include <RCS620S.h> // RCS620S #define COMMAND_TIMEOUT 400 #define POLLING_INTERVAL 500 #define RCS620S_MAX_CARD_RESPONSE_LEN 30 // FeliCa Service/System Code #define CYBERNE_SYSTEM_CODE 0x0003 #define COMMON_SYSTEM_CODE 0xFE00 #define PASSNET_SERVICE_CODE 0x090F #define EDY_SERVICE_CODE 0x170F #define NANACO_SERVICE_CODE 0x564F #define WAON_SERVICE_CODE 0x680B RCS620S rcs620s; // SW, LED and LCD pin assign. #define LED_PIN 7 #define SEL_PIN 6 #define KEY_PIN 5 // 1602 RS R/W E D4 D5 D6 D7 LiquidCrystal LCD(0, 1, 2, 15, 16, 17, 18); void setup(){ pinMode(SEL_PIN, INPUT); // for select SW pinMode(KEY_PIN, INPUT); // for output keybord SW digitalWrite(SEL_PIN, HIGH);// Pullup digitalWrite(KEY_PIN, HIGH);// Pullup pinMode(LED_PIN, OUTPUT); // for Polling Status digitalWrite(LED_PIN, LOW); Keyboard.begin(); LCD.begin(16, 2); LCD.clear(); LCD.setCursor(0, 0); LCD.print("Felica reader"); LCD.setCursor(0, 1); LCD.print("Start..."); delay(3000); // Modified the library for ATmega32U2. // Serial -> Serial1(RX:8, TX:9 pins) Serial1.begin(115200); int ret = rcs620s.initDevice(); while (!ret) { delay(POLLING_INTERVAL); ret = rcs620s.initDevice(); } } void loop(){ digitalWrite(LED_PIN, HIGH); if(digitalRead(SEL_PIN)){ readhistory(); } else { rcs620s.timeout = COMMAND_TIMEOUT; LCD.clear(); if(rcs620s.polling()) { LCD.print("IDm:"); LCD.setCursor(0, 1); for(int i = 0; i < 8; i++) { if(rcs620s.idm[i] / 0x10 == 0) LCD.print(0); LCD.print(rcs620s.idm[i], HEX); if(digitalRead(KEY_PIN)) { sprintf(result, "%02x", rcs620s.idm[i]); Keyboard.print(result); } } if(digitalRead(KEY_PIN)) Keyboard.println(); } else { LCD.setCursor(0, 0); LCD.print("Reading IDm."); if(digitalRead(KEY_PIN)) { LCD.setCursor(15, 0); LCD.write(0x7E); } LCD.setCursor(0, 1); LCD.print("Polling..."); } } rcs620s.rfOff(); digitalWrite(LED_PIN, LOW); delay(POLLING_INTERVAL); } void readhistory() { uint32_t balance; uint8_t buf[RCS620S_MAX_CARD_RESPONSE_LEN]; rcs620s.timeout = COMMAND_TIMEOUT; // サイバネ領域 if(rcs620s.polling(CYBERNE_SYSTEM_CODE)){ // Suica PASMO if(requestService(PASSNET_SERVICE_CODE)){ if(readEncryption(PASSNET_SERVICE_CODE, 0, buf)){ // Little Endianで入っているPASSNETの残高を取り出す balance = buf[23]; // 11 byte目 balance = (balance << 8) + buf[22]; // 10 byte目 // 残高表示 printBalanceLCD("PASSNET", &balance); } } } // 共通領域 else if(rcs620s.polling(COMMON_SYSTEM_CODE)){ // Edy if(requestService(EDY_SERVICE_CODE)){ if(readEncryption(EDY_SERVICE_CODE, 0, buf)){ // Big Endianで入っているEdyの残高を取り出す balance = buf[26]; // 14 byte目 balance = (balance << 8) + buf[27]; // 15 byte目 // 残高表示 printBalanceLCD("Edy", &balance); } } // nanaco if(requestService(NANACO_SERVICE_CODE)){ if(readEncryption(NANACO_SERVICE_CODE, 0, buf)){ // Big Endianで入っているNanacoの残高を取り出す balance = buf[17]; // 5 byte目 balance = (balance << 8) + buf[18]; // 6 byte目 balance = (balance << 8) + buf[19]; // 7 byte目 balance = (balance << 8) + buf[20]; // 8 byte目 // 残高表示 printBalanceLCD("nanaco", &balance); } } // waon if(requestService(WAON_SERVICE_CODE)){ // Block number History1=1, History2=3, History3=5 if(readEncryption(WAON_SERVICE_CODE, 5, buf)){ // Big Endianで入っているWaonの残高を取り出す balance = buf[17]; // 21 byte目 balance = (balance << 8) + buf[18]; // 22 byte目 balance = (balance << 8) + buf[19]; // 23 byte目 balance = balance & 0x7FFFE0; // 残高18bit分のみ論理積で取り出す balance = balance >> 5; // 5bit分ビットシフト // 残高表示 printBalanceLCD("waon", &balance); } } } else { LCD.clear(); LCD.setCursor(0, 0); LCD.print("Reading History"); if(digitalRead(KEY_PIN)) { LCD.setCursor(15, 0); LCD.write(0x7E); } LCD.setCursor(0, 1); LCD.print("Polling..."); } } // request service int requestService(uint16_t serviceCode){ int ret; uint8_t buf[RCS620S_MAX_CARD_RESPONSE_LEN]; uint8_t responseLen = 0; buf[0] = 0x02; memcpy(buf + 1, rcs620s.idm, 8); buf[9] = 0x01; buf[10] = (uint8_t)((serviceCode >> 0) & 0xff); buf[11] = (uint8_t)((serviceCode >> 8) & 0xff); ret = rcs620s.cardCommand(buf, 12, buf, &responseLen); if(!ret || (responseLen != 12) || (buf[0] != 0x03) || (memcmp(buf + 1, rcs620s.idm, 8) != 0) || ((buf[10] == 0xff) && (buf[11] == 0xff))) { return 0; } return 1; } int readEncryption(uint16_t serviceCode, uint8_t blockNumber, uint8_t *buf){ int ret; uint8_t responseLen = 0; buf[0] = 0x06; memcpy(buf + 1, rcs620s.idm, 8); buf[9] = 0x01; // サービス数 buf[10] = (uint8_t)((serviceCode >> 0) & 0xff); buf[11] = (uint8_t)((serviceCode >> 8) & 0xff); buf[12] = 0x01; // ブロック数 buf[13] = 0x80; buf[14] = blockNumber; ret = rcs620s.cardCommand(buf, 15, buf, &responseLen); if (!ret || (responseLen != 28) || (buf[0] != 0x07) || (memcmp(buf + 1, rcs620s.idm, 8) != 0)) { return 0; } return 1; } void printBalanceLCD(char *card_name, uint32_t *balance){ char result[17]; sprintf(result, "Result = \\%u", *balance); LCD.clear(); LCD.setCursor(0, 0); LCD.print(card_name); LCD.setCursor(0, 1); LCD.print(result); sprintf(result, "%s - %u", card_name, *balance); if(digitalRead(KEY_PIN)) Keyboard.println(result); return; }
使用したArduino IDEのバージョンは1.0.2 ATmega32U2対応版です。
ソースプログラム中のカギ括弧にご注意ください。HTMLのタグとの区別ため一部に全角文字を使用しています。Arduino IDEの置換え機能で半角に変換してからコンパルしてください。
Arduinoで音声合成 ― 2014年11月17日
音声合成LSI - AquesTalk pico LSI
AquesTalk pico LSIはATmega328を使用した音声合成エンジンLSIです。外部との接続インターフェースが柔軟で、UART(シリアル)、I2C、SPI接続に対応しています。Arduino Leonardo互換ボードで使用するとするとUARTまたはSPIになります。Felicaリーダーに残高を発声させようとすると残っているインターフェースはSPI接続になります。
電源基板各種 ― 2014年11月22日
たまった電源基板
ネット通販や秋葉原で買い物をする時、必要なパーツ以外についつい電源基板を買ってしまいます。なぜでしょうか。12Vから5Vを作成する場合、7805などの三端子レギュレータ―でもいいのですが低効率のため結構発熱します。DCDCコンバーターならほとんど発熱しません。三端子レギュレータより値段は高いですが安いものを見つけた時に買っています。電源基板が貯まってきた(貯金じゃないよって)ので整理をしようと並べています。組み込んで使用したものもあります。取り扱いのあるショップにリンクを張っておきます。
- 可変電圧LDOローノイズタイプ
TPS7A4700 超ローノイズ・レギュレータ(正出力)
この電源基板はハイレゾ対応DACのプラス電源に使用しました。
TPS7A3301 超ローノイズ・レギュレータ(負出力)
この電源基板はハイレゾ対応DACのマイナス電源に使用しました。
- DCDC昇圧タイプ
LM2577 入力:3~34V、、出力:4~35V、最大出力:2.5A
CE8301 入力0.9〜5V、出力5V、電池昇圧
AS1322A 昇圧型DC-DCコンバータモジュール(3.3V/5V)
入力は0.85V~、電池駆動の電源に最適です。
PFMステップアップDC/DCコンバータ HT7750A(5V)
入力は0.7V~5V、電池駆動の電源に最適です。
基板化されたものもあります。
- DCDC降圧タイプ
5V3A DC-DCコンバータ制御IC SI-8050S
3Aと大出力なのでUSB充電用電源に使用しています。
車や太陽光発電した12V電源からスマホやタブレットの充電に使用する5Vを作ります。
LM2596 入力:4〜40V、出力:1.23〜35V、最大:2A
AMS1117 入力電源:6~12V、出力:3.3V
LC2319 入力電源:12V、出力:5V USB 2個口
最大出力電流:2A
- プラスマイナス2電源タイプ
入力4.5V~18V、出力±5V、±300mA
オペアンプやヘッドフォーンアンプのプラスマイナス電源に使用しています。
入力9V~36V、出力±15V、±200mA
オペアンプやヘッドフォーンアンプのプラスマイナス電源に使用しています。
- LiPo電池充電器
MAX1555リチウムイオンポリマー電池充電IC
TP4056 USBパワー、4.2V/1A、充電指示LED
seeedstudio.com Li-Po ライダー
LiPo電池の充電とUSB 5V出力が一枚の基板できるすぐれものです。、Arduinoの実験用に最適です。LiPo電池側には電源スイッチが付いています。
最近のコメント