SPI の基準環境を作る必要があったので、使い慣れた MCP3008 で作ってみました。
環境
- RobotDyn STM32 MINI (Blue Pill 互換)
- Microchip MCP3008
- Arduino 1.85 + STM32Duino
接続
信号 | MCP3008 | STM32F103 |
---|---|---|
CS | 10PIN /CS | PA4 |
SCK | 13PIN CLK | PA5 |
MISO | 12PIN DOUT | PA6 |
MOSI | 11PIN DIN | PA7 |
テストなので適当な抵抗で分圧すればいいのですが、面白くないのでタッチセンサを作ってみました。
CH0 2.2MΩでプルダウンをし、更に虫ピンを接続して空中に立てています(ブレッドボード上の11b)。
虫ピンに触ると人体のノイズを取得するということになります。
スケッチ
ハードウェアSPIをつなぎます。
シリアルモニタで値を見ます。
PA9,PA10に繋いだUSBシリアルに出力しています。
# include <SPI.h>
# define SPI_CS_PIN PA4
int counter=0;
byte data;
void setup() {
Serial1.begin(9600);
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
SPI.setClockDivider(SPI_CLOCK_DIV16);
pinMode(SPI_CS_PIN, OUTPUT);
}
void loop() {
digitalWrite(SPI_CS_PIN, LOW);
SPI.transfer(0b00000001);
byte data1 = SPI.transfer(0x80); // ch 0
byte data2 = SPI.transfer(0x00);
digitalWrite(SPI_CS_PIN, HIGH);
unsigned int CH0 = ((data1 & 0x03) << 8) + data2;
Serial1.println(CH0);
delay(1000);
}
実行結果
虫ピンに触ったのがうまく検出できました。乾燥している冬だったのでうまくいったのかも知れません。湿度の高い夏などでもうまく行くかどうかは?
おまけ
nRF52840につなぐ場合は、標準では以下のようになります。
SPIデバイス側 | 信号名 | Define定義 | MDBT50Q DB(nRF52840)側 |
---|---|---|---|
CLK | SDC_SDK_PIN | ARDUINO_13_PIN | P1.15 |
DI | SDC_MOSI_PIN | ARDUINO_11_PIN | P1.13 |
DO | SDC_MISO_PIN | ARDUINO_12_PIN | P1.14 |
CS | SDC_CS_PIN | ARDUINO_10_PIN | P1.12 |
VCC | 適当なVCC | ||
GND | GND |