FlashAir로 그래픽 액정 AQM1248A를 제어해 보았다

요 전날, 아키하바라의 아키즈키 전자 씨 매장에서, 어쩐지 눈에 들어가 샀던 초소형 그래픽 LCD 피치 변환 키트 AE-AQM1248(SPI 접속의 초소형 그래픽 액정 AQM1248A 탑재)를, FlashAir로 제어해 보았습니다.

FlashAir W-03의 Lua 스크립트 실행 환경



"FlashAir W-03 시리즈에서는 SD 카드에서 Lua 스크립트를 실행할 수 있습니다. Lua 스크립트를 사용하면 FlashAir의 GPIO 기능을 사용하여 소프트웨어 SPI를 통해 SPI 장치를 제어할 수 있습니다.
지금까지, D/A 컨버터 MCP4922 이나 IO 익스팬더 MCP23S17 를 제어해 보았습니다만, 이번은, FlashAir로 초소형 그래픽 액정 AQM1248A를 제어해 보겠습니다.

구성



필요한 것은 다음과 같습니다.
  • FlashAir W-03 V3.00.01 업데이트 됨
  • 초소형 그래픽 LCD 피치 변환 키트 AE-AQM1248 ( 아키즈키 전자 통상 )
  • SD 카드 슬롯( 카드 소켓 SD-N0940 DIP화)
  • 3.3V 정전압 레귤레이터 ( 아키즈키 전자 통상 )
  • 브레드 보드
  • AC 어댑터 (5V) : 소지품 사용



  • SD 카드 슬롯



    SD 카드 슬롯은 무엇이든 상관 없습니다만, 이번은 SD 카드의 1번, 2번, 7번, 8번 핀을 꺼낼 수 있을 필요가 있습니다.

    FlashAir과 AE-AQM1248 연결



    "FlashAir와 AE-AQM1248의 연결은 아래 표와 같이 연결됩니다.



    CONFIG 파일 설정



     FlashAir의 SD_WLAN 폴더에 있는 CONFIG 파일에 다음 옵션을 추가합니다. IFMODE는 FlashAir의 GPIO 모드를 켭니다. LUA_RUN_SCRIPT는 FlashAir의 전원을 켠 직후 지정된 Lua 스크립트를 시작하는 설정입니다.IFMODE=1
    LUA_RUN_SCRIPT=/GLCDsample.lua

    ※SD_WLAN 폴더와 CONFIG 파일은 불가시 속성 파일이므로 주의해 주세요.

    Lua 스크립트 파일



     FlashAir의 루트 폴더에 다음 코드를 작성한 텍스트 파일(GLCDsample.lua)을 복사합니다.
    이 코드에서는, 우선은 그래픽 액정이 어느 정도의 속도로 재기록되는지를 시험하기 위해, 전면에 비트 패턴을 그려, 지우는 것을 반복합니다. 이 코드를 작성하기 위해 다음 사이트를 참고했습니다.

    시나푸스의 하드 제작기 - Arduino용 헤더 실드 제작(3)

    이번 시도한 AQM1248A는 SPI 접속 대응입니다만, 커맨드 송신과 데이터 송신의 구별을 하기 위해서 RS단자의 HIGH/LOW를 제어할 필요가 있습니다. 따라서 FlashAir의 Lua 스크립트에서 제공되는 fa.spi 함수는 사용하지 않고 D/A 컨버터 MCP4922과 마찬가지로 fa.pio 함수를 사용하여 제어합니다. fa.pio 함수는 그대로는 사용하기 어려우므로 @Seg_Faul 님이 공개하고 있는 라이브러리 FlashAir의 PIO를 Arduino 스타일로 처리 를 이용하고 있습니다. pioduino.lua를 다운로드하고 GLCDsample.lua와 같은 폴더에 넣습니다.

    GLCDsample.lua
    -- FlashAir
    -- AQM1248A 128x48 Graphic LCD
    require("pioduino")
    DA_SCK  = 1  --0x02 0000 0010 --> SD-pin 7
    DA_SDI  = 0  --0x01 0000 0001 --> SD-pin 2
    DA_CS   = 2  --0x04 0000 0100 --> SD-pin 8
    DA_RS   = 4  --0x10 0001 0000 --> SD-pin 1
    
    function delay(value)
        sleep(value)
    end
    
    function SPISend(value)
        digitalWrite(DA_SDI, value)
        digitalWrite(DA_SCK, HIGH)
        digitalWrite(DA_SCK, LOW)
    end
    
    function LcdCommand(value)
        --コマンドデータの出力
        digitalWrite(DA_RS, LOW)
        digitalWrite(DA_CS, LOW)
        --8bitデータ出力
        for i=7, 0, -1 do
            if (bit32.band(bit32.rshift(value, i), 0x01) == 1) then
                SPISend(HIGH)
            else
                SPISend(LOW)
            end
        end
        digitalWrite(DA_CS,HIGH)
    end
    
    function LcdData(value)
        --コマンドデータの出力
        digitalWrite(DA_RS, HIGH)
        digitalWrite(DA_CS, LOW)
        --8bitデータ出力
        for i=7, 0, -1 do
            if (bit32.band(bit32.rshift(value, i), 0x01) == 1) then
                SPISend(HIGH)
            else
                SPISend(LOW)
            end
        end
        digitalWrite(DA_CS,HIGH)
    end
    
    function LCDInit()
        LcdCommand(0xae) --Display = OFF
        LcdCommand(0xa0) --ADC = nomal
        LcdCommand(0xc8) --Common output = revers
        LcdCommand(0xa3) --LCD bias set = 1/7
    
        LcdCommand(0x2c) --power control 1 = 0N
        delay(2);
        LcdCommand(0x2e) --power control 2 = 0N
        delay(2);
        LcdCommand(0x2f) --power control 3 = 0N
    
        LcdCommand(0x23) --Vo voltage resistor ration set
        LcdCommand(0x81) --Electronic volume mode set
        LcdCommand(0x1c) --Electronic volume value set
        LcdCommand(0xa4) --Display all point = normal
        LcdCommand(0x40) --Display start line = 0
        LcdCommand(0xa6) --Display nomal/revers = normal
        LcdCommand(0xaf) --Display = ON
    end
    
    pinMode(DA_SCK, OUTPUT)
    pinMode(DA_SDI, OUTPUT)
    pinMode(DA_CS,  OUTPUT)
    pinMode(DA_RS,  OUTPUT)
    digitalWrite(DA_SCK,LOW)
    delay(1000)
    LCDInit()
    while(1) do
        for page = 0, 5 do
            LcdCommand(0xb0+page); -- 1011 XXXX : XXXX = page address
            LcdCommand(0x10);      -- 0001 0000 : Column address set upper bit = 0000
            LcdCommand(0x00);      -- 0000 0000 : Column address set lower bit = 0000
            for x = 0, 127 do
                LcdData(0)
            end
        end
        delay(1000)
        for page = 0, 5 do
            LcdCommand(0xb0+page);
            LcdCommand(0x10);
            LcdCommand(0x00);
            for x = 0, 127 do
                LcdData(x)
            end
        end
        delay(1000)
        collectgarbage("collect")
    end
    

    요약



    이상으로, FlashAir로부터 fa.pio 함수를 사용해 초소형 그래픽 액정 AQM1248A의 묘화를 제어할 수 있었습니다. 조금 다시 쓰기 속도가 느립니다만. 이것을 사용해, 철도 모형의 포인트 제어 장치로, 포인트 개통 방향의 표시등 해도 재미있을까라고 생각하고 있습니다.

    참고 자료



    시나푸스의 하드 제작기 - Arduino용 헤더 실드 제작(3)
    AQM1248A 데이터시트
    FlashAir의 PIO를 Arduino 스타일로 처리
    FlashAir Developers Lua 함수 참조

    좋은 웹페이지 즐겨찾기