Sim's blog

電子工作はじめてみました

NetduinoでNokia5110液晶に出力してみました

2010-09-16 00:04:46 | Netduino
以前、AVRを使ってaitendoのNokia5110液晶に出力して遊んだことがあります。

AVRでNokia5110を使ってみる (初ネギ)
Nokia5110液晶の高速描画

今回はNetduinoで出力してみました。


この液晶は、SPIで通信する必要があるので、今回初めて使ってみました。関連するクラスは次の2つです。

SPI SPIの本体
SPI.Configuration SPIの設定 (通信速度等)

通信のビット幅は指定できず8ビット固定です。4種類あるフォーマットは全てサポートされています。

ソースコードです。
using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;

namespace Netduino_Nokia5100
{
    public class Program
    {
        static byte [] pic = new byte[48 * 6]{
            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0xb0,0x0c,0x38,0x08,0x18,0x58,0x30,0x60,0xe0,0xe0,0xe0,0xf0,0xe0,0xf0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xf0,0xb0,0x18,0x38,0x08,0x3c,0xec,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x33,0xdc,0xf0,0xd3,0xfc,0xfe,0xfc,0xff,0x7f,0xff,0xff,0x4c,0xf7,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0xee,0xb8,0x60,0xf0,0xe8,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
            0x00,0x00,0x00,0x00,0x00,0xc0,0xf0,0xfc,0xfe,0x7b,0x7c,0xff,0xff,0xff,0xff,0x3f,0x87,0x7f,0x83,0x84,0x8b,0x17,0x3f,0xff,0xff,0x3f,0x07,0x00,0x5f,0x83,0xc7,0xbf,0x1f,0xff,0xff,0xff,0xff,0x1f,0xff,0xfe,0xf8,0xb0,0xc0,0x00,0x00,0x00,0x00,0x00,
            0x00,0x00,0x00,0x50,0xee,0xfb,0x3e,0x07,0x00,0x00,0x01,0x57,0x7f,0xff,0xef,0x89,0x00,0x07,0x07,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x07,0x03,0x07,0x01,0x45,0xff,0xff,0xef,0x0a,0x00,0x00,0x17,0x7f,0xff,0xff,0xfe,0xe8,0xa0,0x00,0x00,
            0x00,0xf0,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x0d,0x77,0xff,0xff,0x0a,0x00,0x00,0x00,0xa0,0x40,0x20,0xc0,0x00,0xc0,0x20,0x40,0x80,0x00,0x00,0x00,0xff,0x7f,0x7b,0x0e,0x00,0x00,0x00,0x00,0x00,0x07,0x7f,0xff,0xff,0xff,0xe8,0x00,
            0x14,0xff,0xef,0x9f,0xea,0x00,0x00,0x00,0x80,0xc0,0xc0,0xc0,0xe0,0xf0,0xf0,0xfd,0xfc,0xff,0xfb,0x82,0x80,0x35,0x52,0xac,0x4f,0x9c,0x61,0x82,0x40,0xff,0xfe,0xfc,0xf8,0xf1,0xe0,0xc0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0xc3,0xff,0xff,0xff,0xa0,
        };

        // Nokia5110 <-> Netduino
        // pin1 Vcc ------ 3.3V
        // pin2 GND ------ GND
        // pin3 SCE ------ D8    pull-up w/ 10k ohm resister
        // pin4 RESET ---- D9    pull-down w/ 10k ohm resister
        // pin5 D/C ------ D10
        // pin6 SDIN ----- D11
        // pin7 SCLK ----- D13
        // pin8 LED+ ----- open or 3.3V
        public static void Main()
        {
            // write your code here

            // initialize
            // rst = D9; dc = D10; sce = D8
            Nokia5100 lcd = new Nokia5100(Pins.GPIO_PIN_D9, Pins.GPIO_PIN_D10, Pins.GPIO_PIN_D8);

            // draw picture
            uint x, y, p;

            p = 0;
            for (y = 0; y < 6; y++)
            {
                lcd.locate(18, y);
                for (x = 0; x < 48; x++) lcd.write(pic[p++]);
            }

            // loop forever
            Thread.Sleep(Timeout.Infinite);
        }

    }

    public class Nokia5100
    {
        OutputPort rst, dc;
        SPI spi;
        byte[] buf = new byte[1];

        public Nokia5100(Cpu.Pin rst, Cpu.Pin dc, Cpu.Pin sce)
        {
            this.rst = new OutputPort(rst, false);  // rst = low
            this.dc = new OutputPort(dc, true);     // d/c = high (data)

            spi = new SPI(new SPI.Configuration(
                sce,    // ChipSelect_Port
                false,  // ChipSelect_ActiveState : active low
                0,      // ChipSelect_SetupTime
                0,      // ChipSelect_HoldTime
                false,  // Clock_IdleState : the idle state of the clock is low
                true,   // Clock_Edge : rising edge
                1000,   // Clock_Rate : 1000KHz
                SPI.SPI_module.SPI1 // SPI_mod : D11 MOSI, D12 MISO, D13 SCK
            ));

            // initialize
            Thread.Sleep(100);      // wait 100ms
            this.rst.Write(true);   // rst = high

            sendcmd(0x20 | 1);      // FSET : PD = 0, H = 1
            sendcmd(0x10 | 3);      // BIAS : BS = 3 (1/48 duty)
            sendcmd(0x80 | 16);     // VOP  : Vop = 16 (contrast)
            sendcmd(0x04 | 1);      // TMP  : TC = 1
            sendcmd(0x20);          // FSET : PD = 0, H = 0
            sendcmd(0x08 | 4);      // DISP : D = 1, E = 0

            clear();
        }
        
        void sendcmd(uint cmd)
        {
            dc.Write(false);    // d/c = low (command)
            buf[0] = (byte)cmd;
            spi.Write(buf);
            dc.Write(true);     // d/c = high (data)
        }

        public void locate(uint x, uint y)
        {
            sendcmd(0x80 | (x & 0x7f)); // SETX 0-83
            sendcmd(0x40 | (y & 7));    // SETY 0-5
        }

        public void clear()
        {
            int i;
            for (i = 0; i < 84 * 6; i++) write(0);
            locate(0, 0);
        }

        public void write(uint data)
        {
            buf[0] = (byte)data;
            spi.Write(buf);
        }

        public void write(byte[] data)
        {
            spi.Write(data);
        }
    }
}


今回は、ジャンプワイヤーの色に凝ってみました。3pinがオレンジ、4pinが黄色、5pinが緑、6pinが青、7pinが紫です。実に分かりやすいですね(笑)。

いつもながら何を出力するのか困りましたが、最近は触覚が生えていて猫耳なのがいいらしいです。

参考
.NET Micro Framework WikiのSPI
Lynx-EyEDの電音鍵盤さんの「netduinoでOLED制御してみた
ニコニコ大百科「中野梓とは

Arduinoに移植してみました

2010-09-15 19:05:33 | Netduino
NetduinoでI2Cの続きになります。

前回は秋月のリアルタイムクロックモジュールRTC8564NBを使った液晶時計をNetduinoで作ってみました。

今回は、ほぼ同じ機能をもつ液晶時計をArduinoに移植してみました。



一部違うのは、Netduinoでは、1秒割り込みを使って、1秒毎に時刻を拾いにいって表示していましたが、Arduino版では無条件に100ミリ秒毎に時刻を拾いにいっていることです。Arduinoでもピン割り込みの機能はあるのですが、ちょうどキャラクタLCDのピンとぶつかっていて使うことができませんでした。

RTC8564NBのCLKOUT出力(1秒割り込み)は、ArduinoのD7につないで、読み取ってLED(D13)でモニターできるようにしています。

RTC8564NBをArduinoから使うには、なんでも作っちゃう、かも。さんのRTC8564ライブラリ(記事)を使うのが便利でいいのですが、今回は比較の意味もこめて、全部自分で書いています。

ArduinoでI2Cを使うにはWireというライブラリを使います。仕様からすると、マルチマスタは考えられていないようですが、その分、.Net Microframeworkより使い方が簡単になっています。WireライブラリのマニュアルはArduino 日本語リファレンスにあります。

ソースコードです。
#include <LiquidCrystal.h>
#include <Wire.h>

#define RTC 0x51

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
uint8_t year, month, day, wday, hour, minute, second;
const char *weekday[7] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

// RTC-8564NB
// 1pin CLKOE  - open
// 2pin CLKOUT - Arduino D7
// 3pin INT    - open
// 4pin Vss    - Arduino GND
// 5pin SDA    - Arduino A4
// 6pin SCL    - Arduino A5
// 7pin NC     - open
// 8pin Vdd    - Arduino 5V <<<

void setup(){
  lcd.begin(16, 2);
  Wire.begin(); // init as master

  sendcmd(0x00, 0x20);  // stop
  sendcmd(0x01, 0x00);  // Control2
  sendcmd(0x0e, 0x00);  // Timer Control
  sendcmd(0x0d, 0x83);  // CLKOUT frequency
  
  sendcmd(0x02, 0x00);  // sec
  sendcmd(0x03, 0x05);  // min
  sendcmd(0x04, 0x23);  // hour
  sendcmd(0x05, 0x05);  // day
  sendcmd(0x06, 0);     // weekday 0:Sun
  sendcmd(0x07, 0x09);  // month
  sendcmd(0x08, 0x10);  // year low

  sendcmd(0x00, 0x00);  // start

  pinMode(13, OUTPUT);
  pinMode(7, INPUT);
}

void loop(){
  digitalWrite(13, digitalRead(7));
  readTime();
  lcd.home();
  hex2(0x20); // year high
  hex2(year);
  lcd.write('/');
  hex2(month);
  lcd.write('/');
  hex2(day);
  lcd.write(' ');
  lcd.print(weekday[wday]);
  
  lcd.setCursor(0, 1);
  hex2(hour);
  lcd.write(':');
  hex2(minute);
  lcd.write(':');
  hex2(second);

  delay(100);
}

void readTime(void)
{
  Wire.beginTransmission(RTC);
  Wire.send(0x02);
  Wire.endTransmission();
  
  Wire.requestFrom(RTC, 7);
  second = Wire.receive() & 0x7f;
  minute = Wire.receive() & 0x7f;
  hour   = Wire.receive() & 0x3f;
  day    = Wire.receive() & 0x3f;
  wday   = Wire.receive() & 0x07;
  month  = Wire.receive() & 0x1f;
  year   = Wire.receive();
}

void sendcmd(uint8_t addr, uint8_t data)
{
  Wire.beginTransmission(RTC);
  Wire.send(addr);
  Wire.send(data);
  Wire.endTransmission();
}

char hexchar[] = "0123456789abcdef";
void hex2(uint8_t x)
{
  lcd.write(hexchar[x >> 4]);
  lcd.write(hexchar[x & 15]);
}

思いつきで、同じものをNetduinoとArduinoの両方に実現してみました。VS2010の補完機能になれてしまうと、全部キータイプしないといけないArduinoが不安になってきます(笑)。このくらいのものだと、何で作ってもそうたいした違いはないですが、やはりデバッグ機能のあるNetduinoが安心して作れると思いました。

9月14日(火)のつぶやき

2010-09-15 02:07:36 | Twitter
01:04 from Twitpic
AT90USBボードでLチカ http://bit.ly/dtKROl


13:12 from Echofon
今日はFTF2010だったか。
13:58 from Echofon
RT: @nxpfan: LPCXpresso LPC1768,エレキジャックのニュースページに掲載いただきました http://www.eleki-jack.com/news/2010/09/lpcxpresso_nxp_lpc1768.html
14:47 from Echofon
100uFも200個入りあるみたい。 RT: @aki_soku: 【新商品】09/14 「電解コンデンサー10μF16V85℃(200個袋売)」700円 | 秋月電子:http://akizukidenshi.com/catalog/g/gP-04165/
18:05 from web
後で読む
【福田昭のセミコン業界最前線】 「究極のメモリ」に一段と近づいたスピン注入メモリ http://pc.watch.impress.co.jp/docs/column/semicon/20100914_393542.html
23:22 from Twitpic
☆board Orange: mbed評価用ベースボード きたー http://bit.ly/bFC5fh


23:34 from Echofon
うぐっ、残念。こうなったらMOMまで買いに走るのだあ RT: @ytsuboi: いいなー、売り切れだったorz
by Sim0000 on Twitter

9月13日(月)のつぶやき

2010-09-14 02:07:13 | Twitter
00:09 from Echofon
3.3Vなら、これとか http://bit.ly/dANkLa RT: @felis_silv: この液晶モジュール、小さくて5~2.7V対応で良さげ!と思ってよく見たら、電源電圧が±だったよ。。(^^; http://bit.ly/bqhUfI
00:18 from Twitpic
TC1602E-25A(R)の裏側。7660というICで負電圧を作っているっぽい。http://bit.ly/dm0VH5


00:19 from Twitpic
パズルショップトリト(http://www.torito.jp/)で買った昔なつかしいパズル


00:24 from Echofon
ええ、そのパターンでいけそうです。 RT: @felis_silv: これってコントラスト調整用だけなんでしょうかね??だとしたら件のモジュールでもVDDに+5~+2.7V、VSSをGND、VEEに負電圧でいけそう??
00:27 from Echofon
あはは、たしかに似てますねw RT: @lynxeyed_atsu: @Sim0000 名前が某プロトタイピングキットの親戚みたいとかおもってしまい、もう末期です....。
00:35 from Echofon
@gomisai JRCという刻印があるのでNJM7660というコンパチ品みたいです。輝度をセンサで読み取って自動でフィードバック・・・
03:26 from web
「あなたのために何か新しいものを調理しています」ティーザー広告気になる。http://www.arduino.cc/
11:06 from web
ついに秋月にきたー。 LPCXpresso NXP LPC1768評価キット http://akizukidenshi.com/catalog/g/gM-04117/ #akiduki
11:08 from web
発売日が2010/2/23になってる・・・
14:57 from Echofon
ちゃんと9/13になってる>LPCXpresso LPC1768 http://akizukidenshi.com/catalog/g/gM-04117/
23:07 from Echofon
LED Zeppelinと書くと別のバンドみたいだ。というか、最初のLEDに反応してしまうw
by Sim0000 on Twitter

9月12日(日)のつぶやき

2010-09-13 02:07:01 | Twitter
03:56 from Echofon
秋葉原だと、鈴商、サンエレクトロといったところでしょうか。 RT: @ytsuboi: しばらく静かだったのは、心の故郷に帰省していたからなのです。まだ256のROMとかSRAMって売っているのだろうか。


03:57 from Echofon
とりあえずはSDCCかと。http://sdcc.sourceforge.net/ RT: @ytsuboi: だがしかし、Mac OS Xで動くZ80アセンブラ(かCコンパイラ)から探さなくてはいけない罠。
04:09 from Echofon
Z80ということだと5Vなので、秋月のこれとかいかがでしょう http://bit.ly/9Z5LWI RT @ytsuboi:SRAMにバッテリ載せてROMの代わりとかいう大人買いをしてみたいのですが、できそうなのも売ってますかねぇ。
04:10 from Echofon (Re: @ytsuboi
@ytsuboi 千石電商も店頭にはSRAM売ってたりします。後は鈴商にもSRAMあります。千石は(秋月も)以前DIPタイプの1Mbitもあったのですが、売り切れています。
04:12 from Echofon (Re: @ytsuboi
@ytsuboi AKI-80に載っているのはこちらですね。5個300円。http://akizukidenshi.com/catalog/g/gI-01461/
04:15 from Echofon (Re: @ytsuboi
@ytsuboi EEPROMですが、若松にもありました。一時期大量に店頭においてありました。今は分かりません><。ROMライターの安いのはaitendoです。5kくらいから
04:19 from Echofon
なるほどROMエミュレータですね。 RT: @ytsuboi: .@Sim0000 EEPROM焼くのも消すのも面倒なので、ROMの代わりにSRAM載せようとか目論んでおります。いまさら紫外線蛍光灯買ってきて箱作るのも…
04:46 from Echofon
おめでとうございます。 RT: @marsee101: Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路がカラー化できました。というブログを書いた。http://bit.ly/bzUsj9 とてもうれしい!!!
14:01 from Echofon
Quartus 10.0sp1をダウンロードしはじめるなど
15:10 from Echofon
nios2eds10.1をインストールするには10.0が必要。nios2eds10.0をインストールするにはquartus10.0が必要。って、やり直しだあ
16:01 from Echofon
これはリッチだ RT: @MobileHackerz: http://img.ly/2438 信じられるかい、親子3人だけでこの部屋(奥に見える和室だけで12畳)使えて大人1泊2食5250円なんだぜ…@関東ITS
23:13 from Echofon
FEZ Pandaって、I/Oがいっぱい使えるんだ。http://www.tinyclr.com/hardware/16/fez-panda/
23:56 from web
Sim0000への問題。0 3 7 7 9 を組み合わせて72を作れ。 http://shindanmaker.com/27823 四則演算だけじゃ無理かも (0! + 7 + 7 + 9) * 3
23:57 from Echofon
ええ、いい感じですね。JTAGも出てるみたいですし。 RT: @lynxeyed_atsu: @Sim0000 これ評価高いですよね。>IO別取り可能。
23:58 from Echofon
今度出るみたいで、まだ予約受付け中です。 RT: @kojisan_rt: FEZ Pandaなんてあったんですねw 確かに色がパンダ・・・ RT: @Sim0000: FEZ Pandaって、I/Oがいっぱい使えるんだ。http://bit.ly/apkJvd
by Sim0000 on Twitter

9月11日(土)のつぶやき

2010-09-12 02:07:06 | Twitter
00:44 from Echofon
あっ、たぶん基板製造の方ですね。きばん本舗SHOPは違うみたいです。 http://kibanhonpo.shop-pro.jp/ RT: @chobichan あれ?。Q&Aに送料無料と書いてあったのは???。
02:24 from Echofon
おおっ RT: @ccutchy: そういやmbedの回路図が更新されてた。裏に居る謎のICも回路図に載ってた。これで勝つる。
02:35 from web
Sim0000への問題。7 2 5 0 2 を組み合わせて72を作れ。 http://shindanmaker.com/27823 7 * 2 * 5 + 2 + 0
02:36 from web
mbed回路図8/26はこちら http://mbed.org/handbook/mbed-NXP-LPC1768
03:05 from Echofon
digikeyでATAVRXPLAIN売ってる。http://bit.ly/90GLWQ 以前はなぜ見つけられなかったんだろう?
16:50 from Echofon
あきばなう!
20:27 from Echofon
秋葉で痛ポルシェを見かけたw
by Sim0000 on Twitter

9月10日(金)のつぶやき

2010-09-11 02:07:15 | Twitter
12:11 from Echofon
トラ技薄いな。リニアテクノロジーの広告が載ってない
12:12 from Echofon
ルネサスの広告もない・・・ 国内半導体メーカー壊滅状態か?
12:12 from Echofon
今月のトラ技は桑野さんのPSoC3記事が載っている
20:47 from web
Sim0000への問題。4 1 2 1 2 を組み合わせて72を作れ。 http://shindanmaker.com/27823 4! * (2 + 2 - 1 * 1)
21:03 from Echofon
きばん本舗って、川崎の駅前だから結構近所だ。送料なしで歩いて取りにいきたいところだw
21:05 from web
Sim0000君。『しかし』を使って短文を作りなさい。 http://shindanmaker.com/28216 #tanbun もし、かしゆかが嫁になってくれたら・・・
21:26 from Echofon (Re: @shintamainjp
@shintamainjp 遅ればせながら☆board Orangeを注文してみました。
21:26 from Echofon
ありゃ、しまった。もう振り込んじゃったw RT: @tomcat_j: 実際取りに来られたお客様が居ます RT @Sim0000 きばん本舗って、川崎の駅前だから結構近所だ。送料なしで歩いて取りにいきたいところだw
21:45 from Echofon (Re: @chobichan
@chobichan ゆうぱっくで788円の送料がかかるみたいです。
by Sim0000 on Twitter

9月9日(木)のつぶやき

2010-09-10 02:06:42 | Twitter
01:09 from web
この前買ってみたAKI-80、ROMがはいってなかった。
10:32 from web
Sim0000への問題。6 2 0 5 6 を組み合わせて72を作れ。 http://shindanmaker.com/27823 6 * 6 * 2 + 5 * 0
10:37 from Echofon
Altera DE4ボード。Stratix4搭載。 http://bit.ly/9H8oLy
11:18 from web
Sim0000への問題。 8 9 2 9 8を組み合わせて1000を作れ。 http://shindanmaker.com/28550 (8 + 2 * (9 - 8)) ^ √9
13:19 from Echofon
おめでとうございます RT: @ssci_official: あともう少しで受注件数が10000件目に達します。 ありがとうございます
13:20 from Echofon
一応こんなのはあるみたいですけどhttp://akizukidenshi.com/catalog/g/gP-00298/ RT: @chobichan: そういえば秋月では、基板の裏にペトっと貼るゴム足を扱っていないなぁ。
13:45 from Echofon
うう、見つけられませんでした。 RT: @tokoya: @Sim0000 あれ?以前買った奴はもう扱ってないのかな?四角い奴。
22:40 from Echofon
ほう RT: @doggie_ele: aitendoさんが長い沈黙を破った!。 RT @aitendo: 液晶キャリーボード http://t.co/WLzHwaB
by Sim0000 on Twitter

9月8日(水)のつぶやき

2010-09-09 02:06:51 | Twitter
00:17 from Echofon
世界でいちばん熱い夏、といえばプリンセスプリンセス
01:19 from Echofon
ついでにコンフィグROMもこわい、おあとがよろしいようでw RT: @yuna_digick: FPGAこわい。マジこわい。 [家]
02:32 from Echofon
導電布? http://sengoku-akb.jugem.jp/?eid=203
13:04 from Echofon
雨って、すごく久しぶりな気がする。
13:16 from web
7 + 3 + 2 * 0
Sim0000への問題。7 2 3 0を組み合わせて10を作れ。 http://shindanmaker.com/27613
by Sim0000 on Twitter

9月7日(火)のつぶやき

2010-09-08 02:06:39 | Twitter
21:52 from Echofon
今日も東京ドームで野球観戦。都市対抗野球はみごと川崎市が優勝!
21:58 from Echofon
試合時間は2時間と野球にしてはずいぶん短かった。一人3安打の1番が全て得点にからんでいい活躍をしていた。
23:15 from Echofon
二塁を踏ませない三安打完封。決勝戦にしては危なげない試合だった。優勝投手の藤田をほめるべきか。
by Sim0000 on Twitter

9月6日(月)のつぶやき

2010-09-07 02:05:46 | Twitter
09:52 from Echofon
4MビットならSRAMの方が使いやすいけどDRAMの方が安い。4Mx1ビットDRAM(60nS)HM514100CLZ6 http://akizukidenshi.com/catalog/g/gI-04156/ #akiduki
11:03 from Echofon
あはは、いかにも古そうですねえ。RT: @chobichan: うわー、今頃日立のZIPなんて、、、何処から出してきたんだ!。 @Sim0000 4Mx1ビットDRAM(60ns)HM514100CLZ6 http://bit.ly/c0vhCy #akiduki
11:03 from Echofon
たしかに。使い道むずかしそうです。 RT: @jujurou: @Sim0000 DC5V単一電源ってのはFPGAとかには使いにくいですね。
23:14 from Echofon
netduinoのファームをビルドできた。なぜか16kバイトくらいでかくなっている。まだ書き込んでいないので、うまくビルドできたかは分からないw
by Sim0000 on Twitter

9月5日(日)のつぶやき

2010-09-06 02:04:57 | Twitter
12:47 from web
GAORAで中継してないので、毎日.jpで都市対抗野球観戦中。川崎が大幅リード
13:09 from web
9回裏の千葉市の反撃をかわして川崎市が勝利。準決勝進出
13:11 from web
次は準々決勝第3試合、横浜対東京だ。これはGAORAで生中継するらしい。
20:23 from Echofon
うぐっ RT: @stastaka: mouserでavrxplainも在庫なし、製造中止になってる
22:26 from web
ブログ書きました。「NetduinoでI2C」 http://bit.ly/9Csi4L #netduino
22:39 from Echofon
ここ?http://bit.ly/9fqYzy RT: @OkibiWorksLabo: 所在地からして謎な久我山電子 http://kugaden.com/ のマイコン(など)用基板


by Sim0000 on Twitter

NetduinoでI2C

2010-09-05 22:00:22 | Netduino
NetduinoでキャラクタLCDの続きになります。

秋月のリアルタイムクロックモジュールRTC-8564NBを使って液晶時計を作ってみました。


RTC8564-NBはI2Cで制御してやる必要があります。以前、RTC-8564NBを使ってみるという記事でAVRから制御したことがあります。

.NET Micro FrameworkにはI2Cのクラスがあるので、これを使えばI2Cで通信ができます(APIリファレンス)。とはいっても、使い方が分かるまで結構紆余曲折でした。

Microsoft.SPOT.HardwareというNamespaceの下にはI2C関連の5つのクラスがあります。
- I2CDevice I2Cデバイスのインスタンスを作るためのクラス
- I2CDevice.Configuration I2Cインタフェースの通信速度等の設定を行うクラス
- I2CDevice.I2CReadTransaction I2Cデバイスからの読み込みを行うトランザクション
- I2CDevice.I2CTransaction I2Cデバイスとのトランザクション
- I2CDevice.I2CWriteTransaction I2Cデバイスへの書き込みを行うトランザクション

まずは、インスタンスを作ります。I2CDeviceクラスとI2CDevice.Configurationクラスを使って、次のように初期化します。

 rtc8564 = new I2CDevice(new I2CDevice.Configuration(0x51, clockRate));

ここで0x51というのはRTC-8564NBのデバイスのアドレスです。clockRateはKHz単位の速度です。今回はint clockRate = 100;としているので100KHzで通信することになります。

実際の通信はrtc8564.Execute(トランザクションの配列, タイムアウト);のようにして行います。タイムアウトはミリ秒単位で指定します。さて、トランザクションって何でしょう?というところで出てくるのが残りの3つのクラスです。

何バイトか読む、もしくは書くというのが一つのトランザクションです。これを束ねて何バイト書いてから、何バイト読むみたいな一連の流れをトランザクションの配列で指定してやります。I2Cはマルチマスタが可能なので、通信している途中に別のマスタが割り込んでこないように、ある程度の読み書きをまとめてする必要があります。そのために、こんな面倒なことをします。

実際のトランザクションの例です。まずはトランザクションの配列を作ります。

 I2CDevice.I2CTransaction[] actions = new I2CDevice.I2CTransation[2];

ここでは2つの要素が含まれる配列actionsを作っています。次に配列の要素を初期化してやります。

 byte[] addr = new byte[1]{ 0x02 };
 byte[] data = new byte[7];

 actions[0] = I2CDevice.CreateWriteTransaction(addr);
 actions[1] = I2CDevice.CreateReadTransaction(data)

actions[0]はI2Cデバイスへの書き込みトランザクションです。書き込む内容はaddrという1バイトの配列です。書き込む長さは配列の長さです。
書き込む内容が変わるときはaddr[0]の内容を書き換えます。書き換えるバイト数が変わるときには別の配列を用意してやる必要があります(結構面倒)。例えばaddr = new byte[2]みたいなことをします。
actions[1]はI2Cデバイスから読み出すトランザクションです。読み込む長さは配列の長さになります。上の例だとdataの長さである7バイトを読み込みます。配列の一部だけ読み込むといった動作はできません。

今回書いたコードです。
using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;

namespace NetduinoI2C
{
    // RTC8564クラスのサンプル by Sim
    public class Program
    {
        static CLCD lcd;
        static string[] WeekDay = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

        public static void Main()
        {
            // write your code here
            lcd = new CLCD(Pins.GPIO_PIN_D12, Pins.GPIO_PIN_D11, Pins.GPIO_PIN_D5, Pins.GPIO_PIN_D4, Pins.GPIO_PIN_D3, Pins.GPIO_PIN_D2);

            // RTCの宣言(通信速度kbps, タイムアウト ミリ秒)
            RTC8564 rtc = new RTC8564(100, 500);

            // 時間の設定 BCDで設定する(stop()してから設定する)
            rtc.year  = 0x10; // 年の下位2桁
            rtc.month = 0x09; // 月
            rtc.day   = 0x02; // 日
            rtc.wday  = 4;    // 曜日 0:日 1:月 2:火 3:水 4:木 5:金 6:土
            rtc.hour  = 0x01; // 時
            rtc.min   = 0x46; // 分
            rtc.sec   = 0x30; // 秒
            rtc.write();

            // start()で開始
            rtc.start();

            // 1HzのCLKOUTの立ち上がりで割り込みがかかるようにする
            InterruptPort clkout = new InterruptPort(Pins.GPIO_PIN_D7, false, Port.ResistorMode.Disabled, Port.InterruptMode.InterruptEdgeHigh);
            // 割り込み処理ルーチンの設定
            clkout.OnInterrupt += new NativeEventHandler(delegate(uint data1, uint data2, DateTime time)
            {
                // 割り込み処理ルーチン。D7の立ち上がりで呼び出される。匿名メソッド

                // RTC8564NBから時刻を読み出す
                rtc.read();

                // 表示
                // 1行目
                lcd.home();
                hex2(0x20);
                hex2(rtc.year);
                lcd.write('/');
                hex2(rtc.month);
                lcd.write('/');
                hex2(rtc.day);
                lcd.write(' ');
                lcd.puts(WeekDay[rtc.wday]);

                // 2行目
                lcd.setCursor(0, 1);
                hex2(rtc.hour);
                lcd.write(':');
                hex2(rtc.min);
                lcd.write(':');
                hex2(rtc.sec);
            });

            // 無限ループ
            Thread.Sleep(Timeout.Infinite);
        }

        // 16進2桁出力
        static char[] hexchar = new char[16] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        static public void hex2(byte x)
        {
            lcd.write(hexchar[x >> 4]);
            lcd.write(hexchar[x & 15]);
        }
    }

    // RTC8564NBドライバ by Sim : EPSON TOYOCOM I2C bus real time clock module
    // 秋月電子 通販コード I-00233 (http://akizukidenshi.com/catalog/g/gI-00233/)
    //
    // 接続例
    // 1pin CLKOE  - open          内部でpull-upされている
    // 2pin CLKOUT - Netduino:D7   1Hzの矩形波出力
    // 3pin INT    - open          未使用
    // 4pin GND    - Netduino:GND
    // 5pin SDA    - Netduino:A4   2.2kΩでpull-up
    // 6pin SCL    - Netduino:A5   2.2kΩでpull-up
    // 7pin NC     - open
    // 8pin Vdd    - Netduino:3.3V パスコンはモジュール上に実装されているので外部には不要

    public class RTC8564 : IDisposable
    {
        I2CDevice rtc8564;

        public byte year, month, day, wday, hour, min, sec;
        public int timeout;

        // トランザクション用
        private byte[] cmd  = new byte[2];
        private byte[] addr = new byte[1] { 0x02 }; // 秒から7バイト読み始める
        private byte[] data = new byte[7];
        private I2CDevice.I2CTransaction[] wr = new I2CDevice.I2CTransaction[1];
        private I2CDevice.I2CTransaction[] rd = new I2CDevice.I2CTransaction[2];

        // コンストラクタ。初期化する(newしたときに呼ばれる)
        // 時刻は未設定、停止状態になる
        public RTC8564(int clockRate, int timeout)
        {
            this.timeout = timeout;

            // define transaction
            wr[0] = I2CDevice.CreateWriteTransaction(cmd);  // for sendcmd()
            rd[0] = I2CDevice.CreateWriteTransaction(addr); // for read()
            rd[1] = I2CDevice.CreateReadTransaction(data);  // for read()

            rtc8564 = new I2CDevice(new I2CDevice.Configuration(0x51, clockRate));

            stop();
            sendcmd(0x01, 0x00); // Control 2 : 0x00
            sendcmd(0x0e, 0x00); // Timer Control : 0x00
            sendcmd(0x0d, 0x83); // CLKOUT frequency : 0x83 (1Hz)
        }

        // 動作開始
        public void start()
        {
            sendcmd(0x00, 0x00); // Control 1 : 0x00
        }

        // 動作停止
        public void stop()
        {
            sendcmd(0x00, 0x20); // Control 1 : 0x20
        }

        // RTC8564にコマンドを送る
        private void sendcmd(byte address, byte data)
        {
            cmd[0] = address;
            cmd[1] = data;
            rtc8564.Execute(wr, timeout);
        }

        // 時刻の読み出し
        public void read()
        {
            rtc8564.Execute(rd, timeout);
            sec   = (byte)(data[0] & 0x7f);
            min   = (byte)(data[1] & 0x7f);
            hour  = (byte)(data[2] & 0x3f);
            day   = (byte)(data[3] & 0x3f);
            wday  = (byte)(data[4] & 0x07);
            month = (byte)(data[5] & 0x1f);
            year  = data[6];
        }

        // 時刻の設定
        public void write()
        {
            sendcmd(0x02, sec);
            sendcmd(0x03, min);
            sendcmd(0x04, hour);
            sendcmd(0x05, day);
            sendcmd(0x06, wday);
            sendcmd(0x07, month);
            sendcmd(0x08, year);
        }

        // デストラクタ
        public void Dispose()
        {
            rtc8564.Dispose();
        }
    }

    // Character LCD Arduino like API by Sim
    public class CLCD
    {
        // 前回と同じなので省略
    }

}

RTC-8564NBにはCLKOUTという1Hz出力端子があります。今回はCLKOUTの立ち上がりで割り込みをかけて、1秒毎に時刻を読み込んで表示するようにしました。
割り込み処理ルーチンは匿名メソッドを使ってMainの中に直接書きました。
A5がSCL、A4がSDAというのはArduinoとピンコンパチです。
トランザクションの配列を事前に用意しておくのが結構面倒です。

9月4日(土)のつぶやき

2010-09-05 02:05:33 | Twitter
08:55 from web
水曜日あたりからブログへのアクセスが妙に増えていると思ったら、AT90USBKEYで検索して見にきているらしい。以前秋月で取り扱いがはじまったことを書いた記事。
09:05 from Echofon
psgrooveの威力はたいしたものだw これをきっかけにAVRはじめる人が増えたりすると、それはそれでうれしいかも。
09:14 from web
ストロベリーリナックスのAT90USB162ボードも売り切れになってる。でもあれって、はんだづけが必要なんだけど、これを機会にはんだづけをする人が増えるとうれしいかも。はんだづけカフェでストリナボードを作る人が増える?
09:21 from web
マルツの78K0基板はまだ残っている。http://bit.ly/e9BVG これもコネクタくらいは、はんだづけが必要
09:25 from web
【速報】Arduino 0019が出ている。http://arduino.cc/en/Main/Software
09:29 from web
AT90USBKEYはdigikeyもmouserも売り切れ。mouserによると製造中止みたいだ。1個買っておけばよかったかな。
09:46 from Echofon
マイクロファンのAT90USB162ボードも売り切れになってる(笑)
09:50 from web
お祭りになってるのはおもしろそうだけど、PS3もってないし、ゲームもしないしで、参加できないし、参加しても意味ない(笑)
12:54 from web
ブログ書きました。「Arduino 0019がリリースされています」http://bit.ly/dmfLRW
16:01 from Echofon
放課後ティータイムというのがバンド名だったのか
16:02 from web
わはは、これはひどい Sim0000の顔は… 0点 です。 http://shindanmaker.com/15220
by Sim0000 on Twitter

Arduino 0019がリリースされています

2010-09-04 12:52:15 | AVR
Arduinoの新しいバージョン0019がリリースされています。

Arduino本家
ダウンロードページ
リリースノート

かなりいい加減ですが、リリースノートを訳してみました(原文)。

[コアとライブラリ]
- Ethernetライブラリの改定
- SPIライブラリの追加
- アナログ入力ピンの別名A0,A1,...の追加
- Stringクラスの追加
- shiftln()関数の追加
- Firmataの更新
- より正確なdelay()
- tone()が終了した後のPWMの再イネーブル
- Serial.peek()の追加
- シリアルにストリームベースクラスを追加
- digitalWrite()とpinMode()がピンに書き込んでいる最中の割り込みの禁止
- Arduino Mega上のアナログリファレンスをINTERNALからINTERNALV1とINTERNAL2V56に変更

[環境]
- Fioをボードメニューに追加
- Arduino ProとPro Mini(5V / 16MHz)をボードメニューに追加
- Processing 1.1コードベースに同期した
- avr-gcc / avr-g++の出力とエラーメッセージの解析を修正
- Toggling RTS on upload for auto-reset with FTDI cables on Linux.
- シリアルモニターのスクロールコントロールを追加
- シリアルモニターの行末を選択するためのドロップダウンを追加
- 名前は同じで拡張子が異なるタブの問題を修正
- サードパーティプラットフォームに、他のプラットフォームで定義されたリファレンスプログラマを許容する(?)

[サンプル]
- より簡単なアクセスと、より良い進行のために再構成と番号付けされた(?)

英語力のないのが悲しいです。