製作モジュール一覧

2016年12月9日金曜日

Raspberry Pi 3とNucleo F401REでSPI通信させてみる。

Sparkfunのチュートリアルhttps://learn.sparkfun.com/tutorials/raspberry-pi-spi-and-i2c-tutorialを参考にした。

配線図




3.3V系同士なので信号レベルは気にせず接続できる。

Raspberry Pi 3B(Master)


Raspberry PiのOSはNOOBSで、SPI通信のライブラリにはWiringPiををインストールして使った。

sparkfunの記事にある通り、
>sudo raspi_config
で、SPIを有効化した。

spitest2.cpp

#include <iostream>
#include <errno.h>
#include <wiringPiSPI.h>
#include <unistd.h>

using namespace std;

static const int CHANNEL = 1;

int main()
{
   int fd, result;
   unsigned char buffer[100];

   cout << "Initializing" << endl ;

   fd = wiringPiSPISetup(CHANNEL, 500000);

   cout << "Init result: " << fd << endl;

   unsigned char cnt = 0;
   while (1) {
           buffer[0] = cnt;
           cnt++;
           result = wiringPiSPIDataRW(CHANNEL, buffer, 1);
           cout << "result: " << result << " recieve: " << int(buffer[0]) << endl;
           usleep(10000);       // wait 10ms
   }
}

オシロで信号を捕捉しやすくするために、while(1)の無限ループでSPI通信をさせたが、ラズパイのCPUが発熱してPCとのTCP/IP通信のエラーが発生したのでusleep()を使ってウェイトをかけるようにした。


コンパイル


>g++ spitest2.cpp -lwiringPi -o spitest2


Nucleo F401RE (Slave)


参考「Arduino UnoをSPI Master、Nucleo F401REをSPI Slaveにして通信してみる。」

今回はタイミングがシビアではないのでprintfで受信結果を表示するようにした。

main.cpp

#include "mbed.h"

#include "SPISlave.h"


SPISlave SpiS(D11, D12, D13, A2);    // mosi, miso, sclk, ssel


int main()

{

    printf("*** SPI Test: Raspberry Pi 3:Master Nucleo:Slave ***\r\n");

   

    SpiS.format(8, 0);

    SpiS.frequency(500000);

   

    uint8_t cnt = 0;

    SpiS.reply(cnt);

    while (1) {

        if (SpiS.receive()) {

            int v = SpiS.read();

            printf("%d\r\n", v);

            SpiS.reply(cnt++);

        }

    }

}

実行


Raspberry Piで

./spitest2

とコマンドを打って実行すると、ラズパイ用のコンソールと、Nucleoからのシリアル出力用のコンソールから送受信結果が
出力される。



SPI信号波形


MOSI


ch1:MOSI ch2:SCK

MISO


ch1:MISO ch2:SCK

CS


ch1:CS ch2:SCK


MISOとMOSIは1kΩのRでプルダウンしているが、これを入れないとHi-Zになったとき(?)に信号波形が崩れるため。SCKとCSはプルダウンしなくても平気な感じだ。

MOSI(プルダウンなし)


MISO(プルダウンなし)


2016年12月6日火曜日

ロギング可能な温度計 基板設計


ラズパイやLME49600のヘッドホンアンプの実験用に温度測定は必須な感じなので、ユニバーサル基板で配線すること、基板の部品面で配線する方向で基板の配線図を考えてみた。

回路図




基板図


もっと簡単にできるかと思っていたが、HDなんちゃら互換のパラレルLCDの配線はなかなかむずかしい。

2016年12月4日日曜日

ロギング可能な温度計の構想

PSoC 4 Prototyping Kitとサーミスタ(SEMITEC 103AT)とPSoC 4 Prototyping Kitを使って素子の温度を測る温度計を実作するつもりで基板の配線を考えてみた。

参考「PSoC 4 Prototyping Kitでサーミスタを使ってみる。(LCD表示)」

回路図




基板図(配線はまだ)


PSoC 4 Prototyping KitにくっついているUSB Serial BridgeのUSBプラグ的なプリントパターンは接触が甘いので使わないことにして、Mini-USBジャックを別途用意して、こちらでPCとのUART通信をさせることにした。

ちょっと困ったのが、PSoC 4 Prototyping KitのUSB Serial Biridge基板の両脇のピンヘッダ/ソケット用のパターンにUSBからの入力信号線が引き出されていないこと。USBジャックに差し込む用のパターンに直に線材をはんだ付けして使うことにした。



ブレッドボードで実験


部品並べ



部品並べ(LCDを外した状態)



パワースイッチはオルタネート・タイプ(押したらずっとON、もう一度押したらずっとOFF)タイプのプッシュスイッチで、強制的にUSBからの給電を接続、切断して再起動する。これはPSoC 4 Prototyping KitのUSB Serial Bridgeを再起動しないとPCのシリアル・コンソールがUSBデバイスとして認識しない場合があるため。