概要

注意(8個のセンサーはなるべく触らないで下さい)

  • センサーのハーフピッチ10ピンソケットは機械的に壊れやすいのでセンサーの抜き差しは優しくして下さい。
  • センサーの赤外線LEDは壊れやすいので、抜けそうな時、やむを得ない時以外、触らないようにして下さい。
  • センサーを抜き差しするときは電源をオフしてから行って下さい。動作中に抜き差しすると壊れることがあります。
  • エアコンの直下でセンサーを動作させると赤外線の影響でエアコンのリモコンが効かないことがあります。場所や角度を変えると避けることができます。

マニュアルの補足

  • 校正:電源ON直後にセンサーの校正をして周囲の明るさ基準値を取得します。
    この時、蛍光灯の真下を避け、センサー上空に何もない状態にして下さい。
    そうしないとセンサーの感度が悪くなる場合があります。
    正しい状態でマイコンリセットか電源抜き差しすると正常に動作します。
  • SSピン:Arduino Nano EveryはマイコンがAtmega4809のためArduino UNOなどATmega168/328のボードとは
    一部のピンが異なります。Arduino Nano EveryのSPIのSSはD8になります。Arduino UNOなどはSSがD10です。
  • LED ONピン:センサーの13ピン(OE_CLED)と14ピン(PWM_CLED)はAND(両方ON)でカラーLEDをONします。
    一部で13ピンと14ピンの配線が入れ替わっている場合がありますが正しく動作します。

センサーの接続方法

センサーとマイコンボードを上記のように接続しマイクロUSBケーブルを接続するとセンサーが検出し始めます。電源を入れてからセンサーが青く光るまでは校正を行うのでセンサーに手などを近づけないで下さい。感度が下がります。

基板パターン図

配線図

Arduinoディレクトリへの移動

プログラムディレクトリ(フォルダ)は下記の通りPCのArduinoディレクトリへ移動して下さい。

スケッチ(sketch) ディレクトリ
IHS11_Nano_Every(IHS11_Nano_Every.ino)

ライブラリ(libraries) ディレクトリ
Sensor(Sensor.cpp, Sensor.h)
CLED(CLED.cpp, CLED.h)

ツール設定例

Arduino IDEでツールの設定は下図を参考にして下さい。

プログラム

sketchディレクトリの「IHS11_Nano_Every.ino」を開きます。
sensor.setAd()で配列adVal[8]にセンサー値をセットしています。この値から上空の変化が推測できるのでそれに合わせてフィギュアなどを制御すると魔法のように感じられます。

#include "CLED.h"
#include <SPI.h>

Sensor sensor(0);               // Sensor型オブジェクト定義、0はエラー対策です。これを直すと影響が大きいのでこのままで
CLED cled(0);                   // CLED型オブジェクト定義、0はエラー対策です。同上です
// ************************** setup ********************************
void setup() {
  //下(9行)のコメントを外すとシリアルモニタで距離(max4300)が見られます
  //#define Monitor
  #ifdef Monitor
  Serial.begin(57600);          // ** シリアルモニタのボーレート57600 **
  #endif
  sensor.init();
  cled.set(5);                  // init blink
  delay(1000);
}

// *************************** loop ********************************
int adVal[COL_LEN];
void loop() {
  sensor.setAd();              // ** この関数実行後、配列adVal[8]にセンサー値が入ります **
  #ifdef Monitor               // ** ここから下はシリアルモニタ用なのでセンシングとは関係ありません **
  sensor.getColAd(adVal);
  for (int i=0; i<COL_LEN;i++) {
    Serial.print(adVal[i]);    // シリアルモニタで8個のセンサー値を出力します
    Serial.print(", ");
  }
  Serial.println("");
  #endif
}

ロジック_センシング(YouTubeから

  • センサー値は精度を上げるため2回演算します。
    • 赤外線LEDオンと赤外線LEDオフのADコンバータ値とのです。
    • 上の値から起動時に保存した初期値(周囲の明るさ)を引いた値です。

カラーLED表示

  • カラーLEDは3個のシフトレジスタ(74HC595)で24bit(3×8)値をシリアルーパラレル変換します。
  • FIX_CLEDを HIGH → LOWで値がシフトレジスタに保存されます
  • OE_CLEDとPWM_CLEDが両方ONのときカラーLEDが光ります。
  • 24bit値は下図のように計算します。

カラーLED プログラム

void CLED::set(byte* pAry, bool isInd) { 				// 1-12[8]:{7, 3,..}
	if (isInd) {										// *** blink indicator ***
		int indiCnt = INDI_CNT << ((inOn) ? 0 : 2);
		if (++inCnt == indiCnt) {						
			inCnt = 0;
			inOn = !inOn;
		}
	}
// ****************************
	unsigned long val24 = 0;
	bool isCledOn = false;
	for (int col = 0; col < COL_LEN; col++) { 			// LED number is opposit direction
		isCledOn |= (pAry[col] > 0);
		bool indiOn = isInd && inOn && (col == COL_LEN - 1) && (!isCledOn);	// indicator 
		byte val1_6 = indiOn ? 6 : pAry[col];
		val24 += (unsigned long)color[val1_6] << col * 3;
	}
	digitalWrite(SEL_SEN, LOW);
	digitalWrite(OE_CLED, LOW);        
	digitalWrite(SS, LOW);
	for (int b = 2; b>=0; b--) {
		SPI.transfer((val24 >> b * COL_LEN) & 0xff);
	}
	digitalWrite(FIX_CLED, HIGH);
	digitalWrite(FIX_CLED, LOW);      
	digitalWrite(SS, HIGH);
	digitalWrite(OE_CLED, HIGH);
}