2016年11月2日水曜日

Nucleo F401RE(mbed)でMCP23S17経由でロータリーエンコーダーを使えるようにする。

配線図



MCP23S17のPA0..PA4はロータリーエンコーダー、PA6、PA7はタクトスイッチ。PortBは4×4のキーパッドをつないだ。重なって見づらいが、MCP23S17のPin5..8(GPB4..GPP7)は10kΩのRでPullDownしている。

mbed repogitry:
https://developer.mbed.org/users/ryood/code/ExioController_Test/ Revision:10

main.cpp

#include "mbed.h"
#include "rtos.h"
 
#include "ExioMcp23s17PinDetect.h"
#include "ExioMcp23s17RotaryEncoder.h"
#include "ExioMcp23s17Keypad4x4.h"
 
SPI Spi(PC_12, PC_11, PC_10); // SPI3: mosi, miso, sclk
//SPI Spi(PA_7, PA_6, PA_5); // SPI1:  mosi, miso, sclk
 
// MExioMcp23s17(int hardwareaddress, SPI& spi, PinName nCs, PinName nReset);
ExioMcp23s17 Exio(0x00, Spi, PD_2, PA_13);
 
bool state = false;
uint8_t count = 0;
 
// トグル動作
void pa6Falled() {
    state = !state;
}
 
// インクリメント
void pa7Falled() {
    count++;
}
 
int main()
{
    //ExioMcp23s17Keypad4x4Test();
    
    printf("\r\n\n*** ExioMcp23s17Controller test ***\r\n");
    
    Exio.reset();
 
    // set PORTA[6:7] as inputs
    ExioMcp23s17PinDetect PinA6(Exio, ExioPortA, 6);
    ExioMcp23s17PinDetect PinA7(Exio, ExioPortA, 7);
    
    // assign callback functions
    PinA6.attach_asserted(&pa6Falled);
    PinA6.setAssertValue(0);
    PinA6.setSampleFrequency();
    
    PinA7.attach_asserted(&pa7Falled);
    PinA7.setAssertValue(0);
    PinA7.setSampleFrequency();
    
    // set PORTA[0:1], PORTA[2:3] as a Rotary Encoder
    //    ExioMcp23s17RotaryEncoder(
    //    ExioMcp23s17& device, ExioPort port, int pin1, int pin2,
    //    int min = 0, int max = 100, int val = 50
    //);
    ExioMcp23s17RotaryEncoder RotEnc1(Exio, ExioPortA, 0, 1, 0, 100, 50);
    RotEnc1.setInterval(500);
    ExioMcp23s17RotaryEncoder RotEnc2(Exio, ExioPortA, 2, 3, 0, 100, 50);
    RotEnc2.setInterval(500);
   
    // set PORTB as Keypad 4x4
    //ExioMcp23s17Keypad4x4 keypad(Exio, ExioPortB);
  
    while (true) {
        int reVal1 = RotEnc1.getVal();
        int reVal2 = RotEnc2.getVal();
        printf("state:%d count:%d RE1:%d RE2:%d \r\n", state, count, reVal1, reVal2);
        //Thread::wait(10);
    }
}

メモ:


4x4のキーパッドも単体では動作できたが、他の機能と同時に動作させるとうまく動かない。Classを適当に作ったのでRTOS等のタイミングがらみか。

ハードウェアに結びついているオブジェクトをコンストラクタで参照渡ししているのも問題かも(^q^; ポインタ渡しに直しておくか。

今日は疲れたので一旦キーパッド入力はあきらめて、ベースマシンのパターン切替えにはタクトスイッチを8個並べる方向で考えてベースマシン本体と結合してみる。