Arduino同士でSPI通信をさせたい

ArduinoでSPI通信をさせてみたくなったので簡単な通信をさせてみる
今回はMEGA(マスタ)とUno(スレーブ)を使って通信させてみる

接続表




Master

Slave

SCK

D52/ICSP3

D13/ICSP3

MISO

D50/ICSP1

D12/ICSP3

MOSI

D51/ICSP4

D11/ICSP3

SS

D53

D10

マスタ側のスケッチ

#include<SPI.h>

void setup() {

  //通信規則
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV4);
  SPI.setDataMode(SPI_MODE2);
  
  SPI.begin();
  Serial.begin(9600);
  digitalWrite(SS,HIGH);
}

int OutData = 12;

void loop() {

  byte InData=0;

  //送信
  digitalWrite(SS,LOW);
  SPI.transfer(OutData);
  digitalWrite(SS,HIGH);


  //受信
  digitalWrite(SS,LOW);
  InData = SPI.transfer(0);
  digitalWrite(SS,HIGH);
  
  Serial.println(InData);

  delay(500);
}


スレーブ側のスケッチ

#include<SPI.h>
 byte receiveValue;

void setup() {

  //通信規則
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV4);
  SPI.setDataMode(SPI_MODE2);
    
    SPCR |= bit(SPE);
    pinMode(MISO,OUTPUT);
    SPI.attachInterrupt();//SPI割り込み
}


void loop() {
  // put your main code here, to run repeatedly:
}

ISR(SPI_STC_vect){
    receiveValue = SPDR;
    SPDR = receiveValue;
}
まずは初期設定から

#include

通信規則?のようなものは一応すべてのSPIデバイスに同じことを書いておかないと通信ができない(ことがある)らしい。一応わかる範囲で説明を書いておく
◇SPI.setBitOrder(order);
order:MSBFIRST:8bit目から送信する
   LSBFIRST:1bit目から送信する

◇SPI.setClockDivider(divider);
divider:クロック源からの分周比の設定。2,4,8,16,32,64,128分周まで設定できる


◇SPI.setDataMode(mode);//SPIクロックLOW
mode: SPI_MODE0(アイドル時のクロックがLow、立ち上がりでサンプリング)
     SPI_MODE1(アイドル時のクロックがLow、立ち下がりでサンプリング)
     SPI_MODE2(アイドル時のクロックがHigh、立ち上がりでサンプリング)
     SPI_MODE3(アイドル時のクロックがHigh、立ち下がりでサンプリング)

◇ SPCR |= bit(SPE)
SPEにb01000000がセットされていてSPCRの7bit目に1をセットしてそれ以外のビットは変更しないということらしい。知らんけど

◇SPI.begin();
マスタ側だけに記述するらしい

通信方法

digitalWrite(SS,LOW);//通信したいSSピンをLOWにする
InData = SPI.transfer(0);//受信した値をInDataに代入する
digitalWrite(SS,HIGH);//通信が終わったらHIGHに戻す

◇ISR(SPI_STC_vect)
SPI通信がされると実行されるプログラムらしい

dsPICのコンフィグ設定

TL594とか位相シフトPWMとかに使われるPWM信号が作りたいのでConfigについて色々しらべてみました。STMマイコンとかでもあったけどそっちもめんどくさそうなのでPICでやってみます。

まずPICというものでLチカをしただけなので「何となく動くんだな」ってくらいでした。

Configの設定情報も少ないので色々調べながらやっています。

 

FBS

//ブートセグメント(プログラム書込領域らしい)設定

BWRP・・・Boot Segment Write Protect

訳すとブートセグメントを書き込めないようにするか?と聞いているらしい

もちろん書き込めなくなっては意味がないので「WRPROTECT_OFF」

BSS・・・Boot Segment Program Flash Code Protection

プログラムが書かれているフラッシュメモリの保護をどうするか?と聞いてるらしいのか?

ここは何もしなくていいでしょう「NO_FLASH

 

FGS

//FBSのセット定義らしい

よくわからいのでデフォルトのままでいいでしょう。

(セキュリティがあったためにバグっても嫌ですし)

 

FOSCSEL

//クロック源の設定

時間の基準となるクロックを決めるもの。

<外部クロック使用時>

FRC・・・外部クロック、ただのRC回路のクロックで約7.37MHz

FRCPLL・・・外部クロック、FRCにPLLを通したもので速度調節可能

PRI・・・外部クロックを使う設定

PRIPLL・・・外部の発振信号にPLLを掛けることで周波数を調整可能

SOSC・・・外部クロック(32.768kHz)をつけて高精度な1秒を出すことができるそうです(外部クロックとかでバラつかないのかな?)

LPRC・・・低電圧(2.5V程度?)型のRC発振(回路。通常は使わないほうがいいだろう

FRCDIV16・・・内部クロックを16分周したもの?よく知らんけど

FRCDIVN・・・外部クロックをN分周したもの?分周させたい時用?

 

IESO

//起動時のクロック指定

簡単に言うと起動時をFRCで起動して、その後ユーザー指定のクロックに切り替えるか?

今回は「OFF」

 

POSCMD

//発振源の種類選択

NONE・・・内部発振源

EC・・・CMOS,TTXのクロック

XT・・・低速水晶クロック

HS・・・高速水晶クロック

ていうことらしい

 

OSCIOFNC

//クロック出力するか?入出力ポートとするか?

 

IOL1WAY

//再構成を許可する?よくわからないので「OFF」

 

FCKSM

//クロックをモニタするか?よくわからないので「OFF」

 

動作クロック周波数の計算

N1・・・入力クロック / a

M・・・b

N2・・・出力クロック / c   ・・・N2の式変形すると

(N2はクロック源の周波数らしい)

Fosc = Fin ・M / (N1×N2)

 

多分間違っている箇所があるかも?

昇圧回路を作ってみる

IH用の実験用電源がないので、ちょうどいい機会だから「アナログ可変電源でも作ってみるか」ってなったわけでDCDCやらPFCやらを調べているところです。

 

昇圧回路は以前に失敗してそれから怖くてやらなかったんですけど、「またやってみるか!」ってなったわけで今回はパワエレなんかでお馴染みのものを作ってみました。(基板がないんでブレッドボードで原理的なところまで)

 

 

 

 

 

12Vでは110Vくらいまでしか上がらなかったんで入力電圧足んないんじゃね?ってことで24V突っ込んでみました。これがいきなり200Vクラスまで上がったんでストップしたんですけどマジで上がったwww(当然のことだけども)

ということで141Vはもちろんイケたんですけどちょっとした電力も動かせないかもしれないのでぼちぼち調べていきます。(LとかCとかの容量も適当だし)

 

 

 

 

 

IH基板製作中

ブログを更新してなかったですが、IH基板作ったりブレボ上でハーフブリッジ で誘導加熱できないか試作してみたりしました。

 

<PSFB-ZVS基板>

沿面距離をかなり開けて高電圧・大電力に対応できる基板を何とか作成しました。(動くかどうかは知らない)

最終的にはPFC回路の電源を突っ込む可能性があるので、400V耐圧で考えています。(爆発しないでほしいなw)

 

<ブレボ上でハーフブリッジ 誘導加熱>

ブレボでできないかな〜と安易な考えから 空芯コイルで誘導加熱っぽいものを試作しましたが、どうもドライバICの発熱がヤバくて(火傷した)充電容量が低いMOSFETをつけて何とかドライバ部分はできました。

出力は何とかされんですけどでも、アレだとフィルタ回路かまさないとマズいかもですね(フィルタ回路いじったことないからな...)

フィルタ回路がない時と超テキトーなフィルタをつけた時の波形を載せときます。当然フィルタがない時は矩形波ですけど...

 

また、進展があったら更新します。

 

f:id:ArcPrize:20201123011448j:plain

f:id:ArcPrize:20201123011453j:plain

 

IHのスイッチング基板設計

現在ZVSのIH回路の動画を見て作ってみたくなったので始めてみようと思います。

でも、共振回路?フィルタ回路?やら何やらがわからないんでひとまず基板作成中

いろいろ試行錯誤しているんですけどね。

<仕様のようなもの>

周波数:500kHz付近で動作させようかな

制御方式:フェーズシフトフルブリッジ とかいうやつ

制御信号はアナログ回路で無理やり的な感じに制御信号は出力しています(これじゃADアンプ?)

素子:SiC-MOSFET

 

品質重視で作りたいんで、今回はメイドインジャパンで作ってもらおうかと...

また何か進捗があれば書いていきます。

それでは・・・

 

(ドローンでPID制御やら何やらがわからなくなってきたんで一旦中断しています)

Arduinoでモーター駆動させた

Arduinoで無理やりUARTでモーターを回転させることに成功しました。
詳細は後日画像付きでアップする予定ですが

ESC

ESCの使い方がそもそもわからなかったけど(初期化をしないと使えないらしい)
デューティー比50%くらいで回して
何msか待機すると初期化が完了するらしいです。(今回使用したモーターだけかも...)

XBee

無線通信モジュール(XBee)
UARTという通信方式を使うところから悩んだけど案外簡単だった。
XBeeの電源は3.3VだけどUARTの信号に気づかずそのままやってたら
何個かXBee壊してしまいました(;´д`)トホホ

無線化!!

そうして何やかんややっている内にどうにかモーター回すだけですけど無線通信はできました。

あとは機体の基板作ってコントローラ(もしかしたら
プレステのを使うかも)作る予定です。
姿勢制御とか大変そうwww
(一応、9軸センサ、SDカードは予習してあるから大丈夫なはず...)

プリント基板作りたいけど中国には頼めないしな〜、種とか届いたら嫌だしwww


シリアルモニターからの送受するプログラム

更新が遅れてしまってすいません。

シリアルモニタをいじっていた時に送受ができなかったので
いろいろ試しているとprintとかprintln系だと動かないらしい
試しにSerial.writeで動作させてみると動くことが判明した。
(バイト数が関係するかもしれない)

プログラム:シリアルモニタからArduinoに文字データを送信して
Arduinoは受信データを送信するというプログラム


while(Serial.available(){
    data = Serial.read();
    Serial.println(data);//これが原因
}