https://independence-sys.net/main/?p=3804 より参照
Arduino Unoとは以下のように接続します。ADT7310 – Arduino 3.3vでもうごくのでラズピコでもOK
CS – Pin10 SS(CS) chip select マイナス論理
SDI – Pin11 MOSI sdi: serial data in
SDO – Pin12 MISO sdo: serial data out
SCL – Pin13 SCK scl: serial clock line
VDD – 5V
GND – GND
Arduino UnoのMISO(Master In Slave Out)端子は、SPI通信でセンサー(スレーブ)からデータを受け取る(読み込む)ための入力端子 MOSIはMaster Out Slave Inの略で、
Arduino(マスター)からセンサや周辺機器(スレーブ)へデータを送信(出力)するための端子です。つまりtx,rxのようなクロス結合となっている。I2CはDaisy Chainで全然ちがう。
#include <SPI.h>/* * ADT7310での温度データ取得 * ADT7310 - Arduino * CS - Pin10 SS(CS) * SDI - Pin11 MOSI * SDO - Pin12 MISO * SCL - Pin13 SCK * VDD - 5V * GND - GND */int SSPin = 10; // Pin10をSS // 初期化void setup(void) { pinMode(SSPin, OUTPUT); Serial.begin(9600); // 以下の3行は呪文やな SPI.setBitOrder(MSBFIRST); //最上位ビット(MSB)から送信 SPI.setClockDivider(SPI_CLOCK_DIV128); //通信速度を遅く設定 SPI.setDataMode(SPI_MODE0); //CPOL(クロック極性):0 CPHA(クロックフェーズ):0 SPI.begin(); SetSSPin(LOW); // マイナス論理、0の間だけ通信可能となる// 本プログラムではループしつづけるのでSetSSPin(High)は不要 //ソフトウェアリセット SPI.transfer(0xFF); SPI.transfer(0xFF); SPI.transfer(0xFF); SPI.transfer(0xFF); SPI.transfer(0x54); // 測定開始(continuously read) delay(500); // 仕様上は、240msで開始} // メインループvoid loop(void) { uint16_t uiVal; float fVal; int iVal; uiVal = (uint16_t)SPI.transfer(0) << 8; // AD変換値 上位 uiVal |= SPI.transfer(0); // AD変換値 下位 uiVal >>= 3; // シフトで13bit化 //uiVal = 0x1fff; //確認テスト用 if(uiVal & 0x1000) { // 13ビットで符号判定 iVal = uiVal - 0x2000; // マイナスの時 (10進数で8192) } else{ iVal = uiVal; //プラスの時 } fVal = (float)iVal / 16.0; // 温度換算(摂氏) Serial.println(fVal, 4); // シリアル送信 delay(5000); //例として5秒待つ}/* * SSピンの設定 * Lowでマスタからの通信が有効(セレクト) * (Highではマスタから通信出来ない(無視される)セレクト解除の状態) */void SetSSPin(int val){ digitalWrite(SSPin, val); }
---------------------------------
const int AIN2 = 8; // 方向制御ピン1
const int AIN2 = 7; // 方向制御ピン2
const int PWMA = 9; // 速度制御ピン (必ずPWM対応ピンにする)
void setup() {
// すべて出力ピンとして設定
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(PWMA, OUTPUT);
}
void loop() {
// --- 1. 正転方向にセット --- HIGH,LOWを逆にすると逆転
digitalWrite(AIN1, HIGH);
digitalWrite(AIN2, LOW);
// --- 2. 徐々に加速 (0 から 255 まで) ---
for (int speed = 0; speed <= 255; speed++)
{
analogWrite(PWMA, speed); // PWM出力で速度変更
delay(20); // 20ミリ秒待機 (約5秒で最高速に)
}
delay(2000); // 最高速で2秒間キープ
// --- 3. 徐々に減速 (255 から 0 まで) ---
for (int speed = 255; speed >= 0; speed--)
{
analogWrite(PWMA, speed);
delay(20);
}
// --- 4. ショートブレーキで1秒停止 ---
digitalWrite(AIN1, HIGH); // LOW,LOWは慣性ブレーキでキレが良くない
digitalWrite(AIN2, HIGH);
analogWrite(PWMA, 0);
delay(1000);
}
- STBY(スタンバイ)ピンの繋ぎ忘れ:ここがGNDに落ちている、またはどこにも繋がっていない状態(オープン)だと、プログラムが正しくてもモーターは一切ピクリとも動きません。必ず5V(HIGH)に接続してください。
- 低すぎるPWM値:
analogWriteの値を50以下などの小さな値にすると、モーターの摩擦に負けてジジジと音がするだけで回転しない(ストールする)ことがあります。動かない場合は数値を高めに設定してみてください。
----------------------------------------------------
#include <Wire.h>
#include <Adafruit_SHT31.h>
// 手持ちはsht35だがsht31で流用可能とのこと 3.3,5いずれもOK
// SHT35インスタンスの作成
Adafruit_SHT31 sht35 = Adafruit_SHT31();
void setup() {
// シリアル通信の開始(PCのシリアルモニタで確認用)
Serial.begin(9600);
while (!Serial) delay(10); // シリアルポートが開くまで待機
Serial.println("SHT35 テストプログラム");
// センサーの初期化 (一般的なI2Cアドレス 0x44 を指定)
// もし動かない場合は 0x45 に変更してください
if (!sht35.begin(0x44)) {
Serial.println("SHT35 センサーが見つかりません。配線を確認してください。");
while (1) delay(1); // エラー時はここで停止
}
Serial.println("SHT35 センサーの初期化に成功しました。");
}
void loop() {
// 温度(摂氏)と湿度(%)の読み込み
float temperature = sht35.readTemperature();
float humidity = sht35.readHumidity();
// 読み込みが正常に行われたかチェック (NaN: Not a Number)
if (!isnan(temperature) && !isnan(humidity)) {
// シリアルモニタへの出力
Serial.print("温度: ");
Serial.print(temperature, 2); // 小数点以下2桁
Serial.print(" °C\t");
Serial.print("湿度: ");
Serial.print(humidity, 2);
Serial.println(" %");
} else {
Serial.println("センサーからのデータ読み込みに失敗しました。");
}
// 2秒待機(SHT35の連続測定負荷を減らすため)
delay(2000);
}
0 件のコメント:
コメントを投稿