FlashAir로 D/A 컨버터 MCP4922를 제어해 보았다

새해 복 많이 받으세요. 올해도 잘 부탁드립니다.
신년 초반의 전자공작 초는, FlashAir로 D/A 컨버터를 제어해 보았습니다.

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



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

구성



필요한 것은 다음과 같습니다.
  • FlashAir W-03 V3.00.01 업데이트 됨
  • MCP4922 ( 아키즈키 전자 통상 )
  • SD 카드 슬롯( 카드 소켓 SD-N0940 DIP화)
  • 3.3V 정전압 레귤레이터 ( 아키즈키 전자 통상 )
  • 브레드 보드
  • 동작 확인을위한 LED 및 저항
  • AC 어댑터 (5V) : 소지품 사용



  • SD 카드 슬롯



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

    FlashAir과 MCP4922 연결



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



    CONFIG 파일 설정



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

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

    Lua 스크립트 파일



    "FlashAir의 루트 폴더에 다음 코드를 포함하는 텍스트 파일 (mcp4922sample.lua)을 복사하십시오.
    이 코드에서는 MCP4922의 VOUTA와 VOUTB의 출력을 서서히 올려가도록 하고 있습니다. 연결된 LED는 번갈아 점차 밝아집니다.

    이번 시도한 MCP4922는 SPI 접속 대응이지만, 간단하게 접속할 뿐만 아니라, 제어하기 위해서는 LDAC 핀의 HIGH/LOW를 제어할 필요가 있습니다. SPI로 16비트 데이터를 전송한 후, LDAC 핀을 로우로 함으로써 VREFA 또는 VREFB에 걸려 있는 전압에 기초하여 기입한 값(0~4096)에 따라 VOUTA 또는 VOUTB의 출력값이 변화한다. 합니다.

    MCP4922에 송신하는 16비트의 데이터는 다음과 같이 되어 있습니다.
    15비트:VOUTA/VOUTB의 선택(0:VOUTA, 1:VOUTB)
    14비트:VREF 입력의 버퍼 제어 유무(0:없음, 1: 있음)
    13비트:출력 게인의 선택(0:VREFA/B의 2배, 1:VREFA/B의 1배)
    12비트:셧다운 제어 유무(0:아날로그 출력 있음, 1:아날로그 출력 없음)
    11~0비트: 출력값 지정(4096단계: 0x000[0]~0xFFF[4095])

    또한, 사실은 FlashAir의 SPI용 Lua 스크립트 함수인 fa.spi 함수를 사용하여 제어하고 싶었습니다만, 잘 작동하지 않고, 우선 이번에는 fa.pio 함수를 사용하여 제어하고 있습니다. fa.pio 함수는 그대로는 사용하기 어려우므로 @Seg_Faul 님이 공개하고 있는 라이브러리 FlashAir의 PIO를 Arduino 스타일로 처리 를 이용하고 있습니다. pioduino.lua를 다운로드하여 mcp4922sample.lua와 같은 폴더에 넣으십시오.

    mcp4922sample.lua
    -- FlashAirでD/AコンバータMCP4922を制御する
    require("pioduino")
    
    MCP4922_OUTA = 0
    MCP4922_OUTB = 1
    DA_SDI  = 0  --0x01 SD-pin 2
    DA_SCK  = 1  --0x02 SD-pin 7
    DA_CS   = 2  --0x04 SD-pin 8
    --DA_SDO  = 3  --0x08 SD-pin 9 --未使用
    DA_LDAC = 4  --0x10 SD-pin 1
    
    function MCP4922DataSend(value)
      digitalWrite(DA_SDI, value)
      digitalWrite(DA_SCK, HIGH)
      digitalWrite(DA_SCK, LOW)
    end
    
    function MCP4922CommandSend(outab, value)
      --コマンドデータの出力
      digitalWrite(DA_LDAC,HIGH) --LDACピンをHIGHに
      digitalWrite(DA_CS,LOW)    --CSピンをLOWに
      --出力ピン(VOUTA/VOUTB)を指定
      if (outab == 0) then
        MCP4922DataSend(LOW)  --VOUTA
      else
        MCP4922DataSend(HIGH) --VOUTB
      end
    
      MCP4922DataSend(LOW)  --VREFバッファ制御なし
      MCP4922DataSend(HIGH) --出力ゲインは1倍
      MCP4922DataSend(HIGH) --アナログ出力あり
      --12ビット分のデータを出力
      for i=11, 0, -1 do
        if (bit32.band(bit32.rshift(value, i), 0x01) == 1) then
          MCP4922DataSend(HIGH)
        else
          MCP4922DataSend(LOW)
        end
      end
      digitalWrite(DA_CS,HIGH)  --CSピンをHIGHに
      digitalWrite(DA_LDAC,LOW) --LDACピンをLOWに
    end
    
    pinMode(DA_SCK, OUTPUT)
    pinMode(DA_SDI, OUTPUT)
    pinMode(DA_CS,  OUTPUT)
    pinMode(DA_LDAC,OUTPUT)
    digitalWrite(DA_SCK,LOW)
    delay(1000) --ここでちょっと待たないと上手く動かない。
    while(1) do
      MCP4922CommandSend(MCP4922_OUTB, 0)
      for cnt = 0, 4000, 100 do
        MCP4922CommandSend(MCP4922_OUTA, cnt)
        delay(100)
      end
      MCP4922CommandSend(MCP4922_OUTA, 0)
      for cnt = 0, 4000, 100 do
        MCP4922CommandSend(MCP4922_OUTB, cnt)
        delay(100)
      end
      collectgarbage("collect") --定期的にお掃除
    end
    

    요약



    이상으로, FlashAir에서 fa.pio 함수를 사용해 D/A 컨버터 MCP4922를 제어할 수 있었습니다.
      이제 FlashAir에 아날로그 출력을 추가할 수 있었습니다. 한층 더 응용의 폭이 크게 퍼지네요.

    참고 자료



    DA 컨버터 MCP4922(SPI)를 이용하여 D/A 변환을 실시한다
    MCP4922 데이터시트
    FlashAir의 PIO를 Arduino 스타일로 처리
    FlashAir Developers Lua 함수 참조

    좋은 웹페이지 즐겨찾기