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制御してみた
ニコニコ大百科「中野梓とは

最新の画像もっと見る

コメントを投稿