網戸戸車交換 BF型 網戸-031

長年使ってた居間の網戸の開け閉めがしづらくなってきました。戸車が摩耗してきたせいです。交換しようと
あれこれ下調べをしましたが,メーカーにもYoutubeにも交換方法がありませんでした。それと,古い網戸の
せいで,型番もわかりません。網戸をはずして大きさを測り,形状が似たものを注文しました。結果同じも
のでした。

一番安い〇Zonで買いましたが高いです。1つ1500円なり。下記が外したものです。

外したものをみてみると,車のレールにあたる部分が,保持しているガイドより下になっていましたのでこ
れでは,スムーズに動かないはずです。取り外しに手こずるかと思いましたが下記の手順であっさりでした。

ねじが2つ見えますので,戸車のユニットの下(2つのねじの間)にドライバーを差し込みます。

てこにしてユニット部分を上に上げると,写真のようになります。

これを手で引き抜きます。その後新しい部品を古い部品を同じ位置に差し込みます。部品の底が,
サッシにせっするように押し込めば完成です。
今回は,純正の部品を使いましたが,サイズ的には,下記の部品も使えそうなので,次回は,これを
使ってみようと思います。値段的には,2つ交換しても,1/5ですみます。>

---翌日----

居間からウッドデッキへの網戸がもう一つあったので,前掲の安いキャスターに交換しました。

問題無く設置できました。ただ,網戸をスライドさせたときの感触は,純正のものよりも抵抗がある
ような気がします。(滑りがわるいかな)でも,十分使えます。

赤外線リモコンリピーター(中継器)(3)

ESP32のリピーターですが,難航してます。とりあえず,信号を送ることはできるようですが,まず取り組ん
だのは,38kHzの変調をすることです。下記のようなスケッチで,波長を探りました。

 startTime = millis();
  for(unsigned long k=0;k<38000;k++){
    digitalWrite(IR_TRANS_PIN, HIGH);
    delayMicroseconds(11);   // キャリア周波数38kHzでON/OFFするよう時間調整
    digitalWrite(IR_TRANS_PIN, LOW);
    delayMicroseconds(14);   // キャリア周波数38kHzでON/OFFするよう時間調整
  }
  endTime=millis();


  Serial.println(endTime-startTime);

出力をハイにするための  delayMicroseconds(**); の括弧のなかの数値を調整して,計測時間が
1000msに近くなるように調整しました。その際,ピンの出力をHIGHにしたときと,LOWにしたときの
時間が,1:3(デュティ比1/3)になるようにしました。その後,実際に動かしてみて,リモコンで
機器が反応するように調整をしました。結果,デュティ比1/3では,反応せす,11:14 ぐらいで反応
しました。
リピーターとして動かすスケッチは至ってシンプルで,受光部からの信号が-の出力があるときだけ赤外
線をだせばいいので,

void loop() {
  while(digitalRead(IR_RECIVE_PIN) == 0 ) {   // 赤外線を検知=0, 検知していない=1
      digitalWrite(IR_TRANS_PIN, HIGH);
      delayMicroseconds(11);   // キャリア周波数38kHzでON/OFFするよう時間調整
      digitalWrite(IR_TRANS_PIN, LOW);
      delayMicroseconds(14);   // キャリア周波数38kHzでON/OFFするよう時間調整
  }
}

初期設定を除いたLOOPはこれだけです。
下記のようなPWMを発生するコマンドもあって,

ledcWriteTone(LEDC_CHANNEL,CARRIER_FREQ);

簡単に38Khzの信号がだせるのですが,このコマンドの後に何かをすると,うまく動かなくなります。
間に,delay(5) ぐらいの間をとらないとだめみたいなので,あまり好きではないのですが,使うのを
やめて

delayMicroseconds(**);

を使って,38kHzの信号を作成しました。

赤外線リモコンリピーター(中継器)(2)

ESP32を使った回路と,既存のレピーターを使った回路であれこれやっています。ESP32を使った回路はなか
なかうまくいきませんが,既存のレピーターを使った回路の改造は,比較的うまくいってます。

写真のように既存のものに,トランジスターをいれて,赤外線LEDをセットしました。この構成で,オリジ
ナルででは,コントロールできなかった,台所のLEDライトのコントロールができました。

回路図では,上記のようになります。手持ちの部品でいろいろやりましたが,2SA1015と2SC1815のトラン
ジスタを使ったものが比較的成績がいいです。この既存のレピーターの受信部は,多分オープンコレクタ
ーの構成になってるのかなと想像してます。できれば,このまま使いたいので,受信部の分解はしていま
せんが,どんな回路なのか興味のあるところです。
ESP32を使った方は,手こずっています。何とか,コントロールするところまで,はこぎ着けたのですが,
送信の赤外線LEDと コントロール する機器の距離がとれません。2SC1815で,増幅して使っているので
すが,うまくいきません。GPIO 端子の出力電流が足りないのか,そのためトランジスタのベースに十分
流せないのか,無い頭をなやませています。

ESP32 リセットを繰り返す 問題

ちまたで結構話題のある表題の問題にぶち当たりました。使い始めた頃は,何の疑問も持ちませんでしたが,
シリアルモニターで確認すると,リセットを繰り返す症状に我慢ができなくなりました。
同じ問題で,悩んでいらっる方も結構いるようで,その対処方については,いろいろのっていました。その
全部をやりましたが,結局それらの方法では,だめでした。やったのは,次のような方法です。

1--Flash Frequency を 80Hz から 40Hz に下げて書き込む。
2--Flash Mode を QIO から DIO に変更する。
3--USBケーブルを太い物に変える。
4--フラッシュメモリーをクリアーする。
5--別なESP32で実行する

結果どれも効果がありませんでした。ただ,4番目のフラッシュメモリ-のクリアーについては,多少苦労し
しましたので,ちょっと補足。下記の命令を WINDOWS のコマンドプロンプトから打つのですが,

esptool.exe –chip esp32 –port COM6 –baud 921600 erase_flash

コマンドプロンプトを開いて,そのままでは,エラーが帰ってきます。このままでは,esptool.exe のおい
てあるるフォルダーへのパスが通ってないので,エラーになります。こうならないように,
カレントディレクトリーを移動してやらないとだめです。私の環境では,

\Users\*******\AppData\Local\Arduino15\packages\esp32\tools\esptool_py\4.5.1

という深い位置に,esptool.exe はありますので,

cd \Users\*******\AppData\Local\Arduino15\packages\esp32\tools\esptool_py\4.5.1

というように cd (チェンジディレクトリー)のコマンドで,移動した後に,上記の esptool.exe を
実行します。比較的最近始められた方は、コマンドプロンプトの使い方なれてないでしょうから、苦労する
かなと思います。詳しいわけではないのですが、大昔に、MS-DOS を経験していますので、それほど苦労せ
ずに、実行できました。ただ、ディレクトリー(フォルダー)を移動するにあたって、階層が深いので、
全部打ち込むのは間違いも多く面倒なので、esptool.exe のプロパティを開いて、場所 から、
ディレクトリーをコピーしたものをテキストエディターにはりつけておいて、それをされにコピーして、
コマンドプロンプトにペーストするという方法で、やりました。

しかし、このいずれもだめでしたが、ふとしたことで、ある方のHPをみて、変更してみるとあっけなく解消
できました。

Event Run On Core0 →→ Core1
Arduino Run On Core0 →→ Core1

に変更したところ、あっけなく解消しました。デフォルトの設定はわかりませんし、どの設定で使うのが正解
なのかはわかりませんが、取り合えず解消しました。あとで、分かったことなのですが、ESP32はデュアルコ
アなので、高性能な反面、設定等、私みたいな、新参者には難しいのかなと感じました。

ESP32 MAX7219 DS1307 時計表示

ESP32をいじってます。MAX7219のドライブの8桁7セグLEDを時計風にしてみました。マトリックスのLED
ではNETより時刻を取得して表示していましたが,今回は,DS1307のRTCのモジュールを使ってみました。

このモジュールについては,諸兄が詳しくHPに掲載していますので,そちらが参考になりますので,覚え
書きに記録します。使うにあたって,諸兄のHPを参考に,基板上のダイオードと抵抗をはずしました。
このモジュールは,バックアップ用に,充電式のボタン電池を使う仕様になっているので,非充電用の
ボタン電池を使うと不具合が起こるようなので,通常のボタン電池で,使えるようにしました。また,
このモジュールをESP32に使うのに〇ZON購入のレベルシフターを使いました。

SWITCHSIENCEで以前に購入したものは保持していたのですが,1つしかなかったので,購入しましたが,
6個中2個が不良でした。安いので,こんなもんでしょうかね。RTCのモジュールは,3.3Vでも動き
ましたが,シフターをはさみました。

動画のような表示ですが,シリアルコンソールから,’y’の入力で,西暦と月を,’m’の入力で,月と
日にちと曜日を表示するようにしました。もっとも,曜日は,数字のままで,今日は,日曜日なので,
0の表示です。
RTCもモジュールは,はじめに初期設定の時刻を書き込みますが,ネットより時刻を取得して,それを
書き込むようにしてあります。下記のようなスケッチですが,使ってない関数もあります。

#include <SPI.h>
#include <Wire.h>
#include <time.h>
#include <WiFi.h>


//時刻設定
#define JST     3600* 9
#define RTC_address 0x68


//DS1307設定
//const char *week[] = {"日","月","火","水","木","金","土"};
const char *week[] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};

uint8_t REG_table[8];

// MAX7219 Command address
#define MAX7219_TEST 0x0f
#define MAX7219_BRIGHTNESS 0x0a
#define MAX7219_SCAN_LIMIT 0x0b
#define MAX7219_DECODE_MODE 0x09
#define MAX7219_SHUTDOWN 0x0C

//SPI設定
#define CS_PIN 5//CLK 18 DIN 23
#define LED_CLK 18
#define LED_DIN 23

//Wifys接続設定

const char* ssid = "***************";
const char* password = "**************";
//const char* ssid = "*****************";
//const char* password = "**************";

struct tm timeInfo;//時刻を格納するオブジェクト
char s[30];//時刻文字格納用

/***********************************************************
*SPIデータ送信--SPIライブラリー使用
*
************************************************************/
void maxTransfer(uint8_t address, uint8_t value) {
   digitalWrite(CS_PIN, LOW);  // Start transfer.
   SPI.transfer(address);      // Send address.
   SPI.transfer(value);        // Send the value.
   //digitalWrite(CS_PIN, HIGH); // Finish transfer.
}

/**********************************************************
*MAX7219初期設定
*
***********************************************************/
void MAX7219_INI(){
   maxTransfer(MAX7219_DECODE_MODE, 0b11011011);// 3.4はデコードしない
      digitalWrite(CS_PIN, HIGH);  
   maxTransfer(MAX7219_BRIGHTNESS, 0x01); // Use lowest intensity.
      digitalWrite(CS_PIN, HIGH);  
   maxTransfer(MAX7219_SCAN_LIMIT, 0x07); // Display digits 01234567
      digitalWrite(CS_PIN, HIGH);

   maxTransfer(MAX7219_SHUTDOWN, 0x01);    // Normal Operation
      digitalWrite(CS_PIN, HIGH);  
   maxTransfer(MAX7219_TEST, 0x00);        // Normal Operation
      digitalWrite(CS_PIN, HIGH);  
}

/******************************************************************
*今回使った書き込み関数
*
*******************************************************************/
void LED_OUT(uint8_t addr, uint8_t dat){
  digitalWrite(CS_PIN, LOW);
  shiftOut(LED_DIN, LED_CLK, MSBFIRST, addr);
  shiftOut(LED_DIN, LED_CLK, MSBFIRST, dat);
  digitalWrite(CS_PIN, HIGH);
}

/********************************************************************
*int ch_to_int(char,char)
*
*********************************************************************/
int ch_to_int(char a,char b){

  int buff;
  int c=a-'0';//charをintに変換
  int d=b-'0';//charをintに変換
  buff=(c<<4) | d;
  return buff;  
}


/********************************************************************
*7セグ初期化
*
*********************************************************************/
void sevn_seg_init(){
  LED_OUT(0x9, 0b11011011);   //7セグでデコードするビットに1を立てる:
  LED_OUT(0xA, 5);   //輝度を設定, 0-15:
  LED_OUT(0xB, 7);    //使用する桁数を指定, 桁数-1:
  LED_OUT(0xC, 1);    //特にいじる必要なし:
  LED_OUT(0xF, 0);    //同上:
}
/************************************************************************************************************************************
*Set up
*
**********************************************************************/
void setup() {
 
  Wire.begin();
  Serial.begin(115200);


  pinMode(CS_PIN,  OUTPUT);
  pinMode(LED_CLK, OUTPUT);
  pinMode(LED_DIN, OUTPUT);
 
  digitalWrite(CS_PIN,  HIGH);
  digitalWrite(LED_CLK, LOW);
  digitalWrite(LED_DIN, LOW);


//Wify接続
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }
  Serial.println();
  Serial.printf("Connected, IP address: ");
  Serial.println(WiFi.localIP());


 //Netより時刻を取得
  configTime(9 * 3600L, 0, "ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp");
  getLocalTime(&timeInfo);//tmオブジェクトのtimeInfoに現在時刻を入れ込む
  sprintf(s, " %04d/%02d/%02d %02d:%02d:%02d:%02d",
          timeInfo.tm_year + 1900, timeInfo.tm_mon + 1, timeInfo.tm_mday,
          timeInfo.tm_hour, timeInfo.tm_min, timeInfo.tm_sec,timeInfo.tm_wday);//人間が読める形式に変換
  delay(800);


Serial.print(s[1]);//西暦
Serial.print(s[2]);
Serial.print(s[3]);
Serial.print(s[4]);
Serial.print("-");
Serial.print(s[6]);//月
Serial.print(s[7]);
Serial.print("-");
Serial.print(s[9]);//日
Serial.print(s[10]);
Serial.print("-");
Serial.print(s[12]);//時
Serial.print(s[13]);
Serial.print("-");
Serial.print(s[15]);//分
Serial.print(s[16]);
Serial.print("-");
Serial.print(s[18]);//秒
Serial.print(s[19]);
Serial.print(s[20]);
Serial.print(s[21]);
Serial.println(s[22]);
//Serial.println(s[23]);

//RTCに現在時刻データを書き込む
  Wire.beginTransmission(RTC_address);
  Wire.write(0x00);//Register 先頭アドレス
  Wire.write(ch_to_int(s[18],s[19]));//second
  Wire.write(ch_to_int(s[15],s[16]));//minute
  Wire.write(ch_to_int(s[12],s[13]));//hour
  Wire.write(s[22]-'0');//week  
  Wire.write(ch_to_int(s[9],s[10]));//day
  Wire.write(ch_to_int(s[6],s[7]));//month
  Wire.write(ch_to_int(s[3],s[4]));//year
  Wire.endTransmission();

  digitalWrite(CS_PIN,  HIGH);
  digitalWrite(LED_CLK, LOW);
  digitalWrite(LED_DIN, LOW);
 
  LED_OUT(0x9, 0b11011011);   //7セグでデコードするビットに1を立てる:
  LED_OUT(0xA, 5);   //輝度を設定, 0-15:
  LED_OUT(0xB, 7);    //使用する桁数を指定, 桁数-1:
  LED_OUT(0xC, 1);    //特にいじる必要なし:
  LED_OUT(0xF, 0);  
 
 //7セグ初期設定
  //sevn_seg_init();


//7セグに表示
  LED_OUT(0x3, 1);            //3ケタ目'-'
  LED_OUT(0x6, 1);            //6ケタ目'-'
}


char h_on=1;
char y_on=0;
char m_on=0;

/*****************************************************************
*メインループ
*
******************************************************************
void loop() {


  char inkey;


  Wire.beginTransmission(RTC_address);
  Wire.write(0x00);//Register 先頭アドレス
  Wire.endTransmission();


//RTCデータの読み込み
  Wire.requestFrom(RTC_address,7);


  for(int i=0;i<=7;i++){
    REG_table[i]=Wire.read();
  }


if( Serial.available() > 0  ) {
    inkey = Serial.read();
    switch (inkey){
      case 'h':h_on=1;
               y_on=0;
               m_on=0;
               break;
      case 'y':h_on=0;
               y_on=1;
               m_on=0;
               break;
      case 'm':h_on=0;
               y_on=0;
               m_on=1;
               break;    
    }
  }



if(h_on==1){//時分秒を表示
  LED_OUT(0x9, 0b11011011);


  LED_OUT(0x1, REG_table[0]); //秒を表示
  LED_OUT(0x2, REG_table[0]>>4);//10秒を表示


  LED_OUT(0x3, 1);


  LED_OUT(0x4, REG_table[1]);//分を表示
  LED_OUT(0x5, REG_table[1]>>4);//分を表示


  LED_OUT(0x6, 1);


  LED_OUT(0x7, REG_table[2]);//時を表示
  LED_OUT(0x8, REG_table[2]>>4);//時を表示
}


if(y_on==1){//年号月の表示
    LED_OUT(0x9, 0b11111111);
    LED_OUT(0x8,2);
    LED_OUT(0x7,0);
    LED_OUT(0x6,REG_table[6]>>4);
    LED_OUT(0x5,REG_table[6]);
    LED_OUT(0x4,0xF);
    LED_OUT(0x3,0xF);
    LED_OUT(0x2,REG_table[5]>>4);
    LED_OUT(0x1,REG_table[5]);
}
if(m_on==1){//月日曜日の表示
    LED_OUT(0x9, 0b11111111);
    LED_OUT(0x8,REG_table[5]>>4);//月
    LED_OUT(0x7,REG_table[5]);
    LED_OUT(0x6,0xF);
    LED_OUT(0x5,REG_table[4]>>4);//日
    LED_OUT(0x4,REG_table[4]);
    LED_OUT(0x3,0xF);
    LED_OUT(0x2,REG_table[3]);//曜日
    LED_OUT(0x1,0xF);
}


}

SwitchBotを取り付けました。(1)

主がいなくなってしまった実家に,短い時間ですが,毎日通ってます。実家で夕食を作って食べてからこちら
にもどってくるのですが,20時近くになってしまうので,あたりはくらくなってしまいます。本当は,電気
をつけたままにしておけばいいのでしょうか,電気代がもったいないので,付いてから一端玄関から上がって
玄関の電気を使えてから,荷物を取りに車までも¥どります。その間,電気が付くまで足下が暗くて危ないの
で,SwitchBotをつけて遠隔で電気が付くようにしました。

取り付けるにあたって,周りが土壁?で,接着剤等利きにくいので,取り付けアダプター?を使いました。

このアダプターを既存のスイッチプレートの下に挟みこむようにして取り付け,SwitchBotをつけました。
アダプターの取説にあるように,SwitchBotにもともと付いている両面テープはついてい位置が,いまいちな
のではがして,予備の両面テープをはりました。取り付けて二日目ですが,具合いいようです。

取り付けのアダプター?はよく見ると,積層構造?のようで,もしかして3Dプリンターでの品物かなと想像
しました。今回は,玄関の蛍光灯用につけましたが,換気扇の表示のスイッチは,玄関の街灯のもので,時
間がくると切れるようになってますが,ここにもSwitchBotをつけると,SwitchBotのタイマーがつかえるの
自動で付いたり消したりできるようになるかなと思います。そそのうちつけようかなと思います。

やっと実が付きました。2つだけ!!

何年か前,多分コロナが流行るまえだったかと思いますが,サクランボの苗木を購入して鉢植えにしました。
一種類では実が付かないというので,最初に佐藤錦をかいましたが,高砂をあとから買い足し鉢植えにしま
した。

写真右側が佐藤錦で左が高砂です。
一昨年あたりから,花咲き始めましたが,実はなりませんでした。今年は,佐藤錦だけ花が先にさき,高砂は
花がまださきません。このままでは,受粉できないので,今年も実はならないかな,と思ってましたが,なん
と小さなマッチ棒ほどの実が2つほどつきました。

赤く色づいてくれるかわかりませんが,どのように育つか,楽しみです。

MAX7219の使い方8×8LCD無ライブラリー(9)ESP32編

この4日~5日の間,頭をさんざん悩ませていました。何のことはない,数字のを上から落ちてくるようにし
たくて,あれこれなやんでしました。特に,この二日間は,散歩しながらも,うまくいかない原因を考えては
,手直しを考える。散歩が終わってからは実際に修正してみる,の繰り返しをしてました。今日,やっと思っ
た動作ができるよいうになりました。スケッチのアルゴリズム(手順)は,ほぼ間違いなかったのですが,
順番を間違っていました。本来ならば,

  保持しているメモリの移動→→新しい書き込み

の順でしなければならないのに,

  書き込み→メモリーの移動

の順にしてました。完成したときは,思わず,やった,と叫びそうになりました。

動画のような動作になりますが,一秒の表示のところが,時々,数字が飛びます。これは,処理の関係で仕方
ないのかなと思います。スケッチは,ほとんどが,bit の操作で,今回は,備え付けの関数を使わないで,
or と and で処理しました。冗長なスケッチですが,次のものが,数字をセットする部分のスケッ
チです。

/**************************************************************
*number_set_V_T(int y,int x,string num)
*
***************************************************************/
void number_set_V_T(int y,int x,char ch){
 
  int num;
  unsigned char buff;
  unsigned char buff_suji;


  if(ch=='0'){num=0;}
  if(ch=='1'){num=1;}
  if(ch=='2'){num=2;}
  if(ch=='3'){num=3;}
  if(ch=='4'){num=4;}
  if(ch=='5'){num=5;}
  if(ch=='6'){num=6;}
  if(ch=='7'){num=7;}
  if(ch=='8'){num=8;}
  if(ch=='9'){num=9;}
  if(ch=='A'){num=10;}


  int u_num=(x-1)/8+1;
  if((x % 8)==0){
     x=8;
  }
  else{
     x=x % 8;
  }


  switch (x){    
      case 8:
        for(int n=7;n>=0;n--){
          v_shift_T(u_num,x);


          buff_suji=suuji[num][n];
          buff_suji=buff_suji<<2;//数字を2ビットシフト
          dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b00011111;
          dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;
          dummy[8-n]=dot_hoji[u_num][1];


          dot_hyouji(u_num);
          delay(TM);
         
        }
        break;
      case 7:
        for(int n=7;n>=0;n--){
           v_shift_T(u_num,x);


          buff_suji=suuji[num][n];
          buff_suji=buff_suji<<1;//数字を2ビットシフト
          dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b10001111;
          dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;
         
          dot_hyouji(u_num);
          delay(TM);
         
        }
        break;      
      case 6:
        for(int n=7;n>=0;n--){
           v_shift_T(u_num,x);


          buff_suji=suuji[num][n];
          dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b11000111;
          dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;
         
          dot_hyouji(u_num);
          delay(TM);
        }
        break;
      case 5:
       for(int n=7;n>=0;n--){
          v_shift_T(u_num,x);


          buff_suji=suuji[num][n];
          buff_suji=buff_suji>>1;//数字を右に1ビットシフト
          dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b11100011;
          dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;
         
          dot_hyouji(u_num);
          delay(TM);
        }
        break;      
      case 4:
        for(int n=7;n>=0;n--){
          v_shift_T(u_num,x);


          buff_suji=suuji[num][n];
          buff_suji=buff_suji>>2;//数字を右に2ビットシフト
          dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b11110000;
          dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;


          dot_hyouji(u_num);
          delay(TM);
        }
        break;  
      case 3:
        for(int n=7;n>=0;n--){
          v_shift_T(u_num,x);


          buff_suji=suuji[num][n];
          buff_suji=buff_suji>>3;//数字を右に3ビットシフト
          dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b11111000;
          dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;
         
          dot_hyouji(u_num);
          delay(TM);
        }
        break;
      case 2:
        if(u_num>1){
          for(int n=7;n>=0;n--){
            v_shift_T(u_num,x);


            buff_suji=suuji[num][n];
            buff_suji=buff_suji>>4;
            dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b11111100;
            dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;
           
            buff_suji=suuji[num][n];
            buff_suji=buff_suji<<4;
            dot_hoji[u_num-1][1]=dot_hoji[u_num-1][1] & 0b01111111;
            dot_hoji[u_num-1][1]=dot_hoji[u_num-1][1] | buff_suji;


            dot_hyouji(u_num);
            delay(TM);
          }
        }
        else{
          for(int n=7;n>=0;n--){
            v_shift_T(u_num,x);


            buff_suji=suuji[num][n];


            buff_suji=buff_suji>>4;
            dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b11111100;
            dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;
            buff_suji=suuji[num][n];


            dot_hyouji(u_num);
            delay(TM);
          }
        }
        break;
      case 1:
        if(u_num>1){
          for(int n=7;n>=0;n--){
            v_shift_T(u_num,x);


            buff_suji=suuji[num][n];
           
            buff_suji=buff_suji>>5;
            dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b11111110;
            dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;
           
            buff_suji=suuji[num][n];
            buff_suji=buff_suji<<3;
            dot_hoji[u_num-1][1]=dot_hoji[u_num-1][1] & 0b00111111;
            dot_hoji[u_num-1][1]=dot_hoji[u_num-1][1] | buff_suji;


            dot_hyouji(u_num);
            delay(TM);
          }
        }
        else{
          for(int n=7;n>=0;n--){
             v_shift_T(u_num,x);


            buff_suji=suuji[num][n];
            buff_suji=buff_suji>>5;
            dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b11111110;
            dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;
           
            dot_hyouji(u_num);
            delay(TM);
          }
        }
        break;      
  }
}

次が,メモリーをシフトする部分のスケッチです。

/**************************************************************
*void v_shift_T(int u_num,x)
*
****************************************************************/
void v_shift_T(int u_num,int x){
  unsigned char buff=0;
  unsigned char buff1=0;
 
 switch (x){
    case 8:
       for(int n=8;n>1;n--){
        buff=dot_hoji[u_num][n-1] & 0b11100000;
        buff1=dot_hoji[u_num][n] & 0b00011111;
        dot_hoji[u_num][n]=buff | buff1;
      }
      break;
    case 7:
      for(int n=8;n>1;n--){
        buff=dot_hoji[u_num][n-1] & 0b01110000;
        buff1=dot_hoji[u_num][n] & 0b10001111;
        dot_hoji[u_num][n]=buff | buff1;
      }
      break;    
    case 6:
      for(int n=8;n>1;n--){
        buff=dot_hoji[u_num][n-1] & 0b00111000;
        buff1=dot_hoji[u_num][n] & 0b11000111;
        dot_hoji[u_num][n]=buff | buff1;
      }
      break;
    case 5:
      for(int n=8;n>1;n--){
        buff=dot_hoji[u_num][n-1] & 0b00011100;
        buff1=dot_hoji[u_num][n] & 0b11100011;
        dot_hoji[u_num][n]=buff | buff1;
      }
      break;
    case 4:
      for(int n=8;n>1;n--){
        buff=dot_hoji[u_num][n-1] & 0b00001110;
        buff1=dot_hoji[u_num][n] & 0b11110001;
        dot_hoji[u_num][n]=buff | buff1;
      }
      break;
    case 3:
        for(int n=8;n>1;n--){
          buff=dot_hoji[u_num][n-1] & 0b00000111;
          buff1=dot_hoji[u_num][n] & 0b11111000;
          dot_hoji[u_num][n]=buff | buff1;
        }
        break;
    case 2:
        if(u_num>1){


          for(int n=8;n>1;n--){
            buff=dot_hoji[u_num][n-1] & 0b00000011;
            buff1=dot_hoji[u_num][n] & 0b11111100;
            dot_hoji[u_num][n]=buff | buff1;


            buff=0;
            buff1=0;


            buff=dot_hoji[u_num-1][n-1] & 0b10000000;          
            buff1=dot_hoji[u_num-1][n] & 0b01111111;
            dot_hoji[u_num-1][n]=buff | buff1;
          }
        }
        else{
          for(int n=8;n>1;n--){
            buff=dot_hoji[u_num][n-1] & 0b00000011;
            buff1=dot_hoji[u_num][n] & 0b11111100;
            dot_hoji[u_num][n]=buff | buff1;
          }
        }
        break;
    case 1:
      if(u_num>1){
          for(int n=8;n>1;n--){
            buff=dot_hoji[u_num][n-1] & 0b00000001;
            buff1=dot_hoji[u_num][n] & 0b11111110;
            dot_hoji[u_num][n]=buff | buff1;


            buff=dot_hoji[u_num-1][n-1] & 0b11000000;          
            buff1=dot_hoji[u_num-1][n] & 0b00111111;
            dot_hoji[u_num-1][n]=buff | buff1;
          }
        }
        else{
          for(int n=8;n>1;n--){
            buff=dot_hoji[u_num][n-1] & 0b00000001;
            buff1=dot_hoji[u_num][n] & 0b11111110;
            dot_hoji[u_num][n]=buff | buff1;
          }
        }
      break;            
  }
}

かなり頭を悩ませましたが,やっとできて,ほっとしてます。こうやって,ああでもないこうでもないとあれ
これ考えることはとってもいいぼけ防止になってるるかなと思います。

ESP32で秋月ACM1602NIを使う (2)

早とちりしてました。何回かのトライで,昇天させたかと思っていましたが,しばらく,PICへの書き込みをし
ていなかったのでうまくデータを読み込めていなかったようです。その後何度か書き込みにトライしてみた
ら,見事成功しました。久しぶりにPICKIT3を使ったのですが,調子悪いものがあり,結局,中華製の安いも
のでの成功でした。書き込みに使ったPCも今使っているものの前に使っててもので,このPCはUSBポートの調
子がいまいちでしたが,何カ所かあるポートのうちの一カ所が調子いいようで,やっとそこで成功いたしまし
た。

I2Cの通信速度を落とさなくても,I2Cスキャナーでも確認できましたし,

 Wire.begin(21,22)

のデフォルトの設定で,テストプログラムも動きました。LCDを壊さなくてよかったです。それに,あきらめ
なくて良かったです。今日は,ぐっすりねむれるかなあ。

それにしても,先達はすごいですねえ。今回,参考にさせていただいたHPの大本は,以前,ローコストシリア
ル通信モニターを作成したときのHPの方のHPでした。

今回I2CのLCDをあれこやったのは,複数のI2Cの機器や,SPIとI2Cの機器を混在させて使ってみようかなと考
えたからです。これで,秋月のLCDも回路に組み込むことができます。

**********追記**********
その後あれこれやりましたが,オリジナルのファームウエアーでは,下記の設定の 70000 が限界のようで

   Wire.begin(21,22,70000)

した。それを過ぎると認識(I2C通信不可になる)されなくなるようでした。ファームウエアの書き換え
できないようなら,通信速度を落として使うか,ACM1602NI以外のLCD使うようでしょうね。

ESP32で秋月ACM1602NIを使う (1)

あれこれやっているうちに,ESP32でも,手元にあった秋月のACM1602NIというLCDを使ってみることにし
ました。ACM1602NIは,バックライトの半固定抵抗,プルアップ用の抵抗,5Vで使う抵抗,等の外部の
配線がいるので,ブレッドボード用に小さな基板でアダプター?を作成しました。

いざサンプルのスケッチを書き込んで動作確認。ところが,うんともすんともいいません。配線が間違
ったのかと思いなんども確認しました。間違いがないようなので,I2Cスキャナーというスケッチで接続
を確認しても確認できません。別なI2CのLCDを接続してみると,そのLCDは接続が確認できて,I2Cのアド
レスも表示されます。ただ,時々,秋月のLCDを接続して,I2Cスキャナーを動かすと瞬間認識されること
もありました。さんざん頭をなやまして,あれこれ,くぐりましたがその原因にやっと行き着くことがで
きました。やはり先達は,すごい。なんと,ACM1602NIは,I2Cの標準通信速度の要件をみたしていなかっ
たのです。解決には,通信速度を下げるか,ACM1602NIのフォームウエア-を書き換えるかの2択だとあり
ましたので,とりあえず通信速度を落としてみました。Wire.h のライブラリーをつかいますが,このラ
イブラリーで,Wire.bigin()の初期設定をしますが,この設定で,SCL,SDA端子の設定,通信速度の設定を
するようです。通常は,通信速度は,省略するすとデフォルトの100000 が選択されるようですが,ここ
で, 50000 に落としてみました。

   Wire.bigin(21,22,50000); //(SCL端子,SDA端子,周波数)

に変更してみると,I2Cスキャナー も サンプルスケッチもあっけなく動きました。

下記のスケッチは,あるHPからお借りした,I2Cスキャナーのものです。このスケッチで,I2Cの個別のア
ドレスを取得することができます。通常は,ソフトで,I2Cのアドレスを変更できるみたいですが,秋月の
のものは,ソフトでは,変更できないようで,RX と表示のあるピンをGNDに落とすことで,0x3d に変更で
きるようです。(フォームウエア書き換え後みたいでした。)

// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// Version 6, November 27, 2015.
//    Added waiting for the Leonardo serial communication.
//
// branch out for ESP32 2018/05/25
//
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//
#include <Wire.h>

void setup()
{
  Wire.begin(21,22,50000);  //ここを書き換えた
  Serial.begin(115200);        
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}

void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
  delay(5000);           // wait 5 seconds for next scan
}

幸い,手元には,ACM1602NI のフォームウエア-を書き換える部材は,そろっていますので,後日,
ACM1602NIのフォームウエア-を書き換えて,標準の通信速度で動くか確認してみようかなと思います。

arduino では,問題なく動いたのに,ESP32 で動かないのは,arduino の動作速度が,ESP32 に比
べるとその分,遅いのでしょうかね。

***********後日談************
諸先輩のHPを参考に,ACM1602NIに搭載されている16F689の書き換えを行ったが,見事に失敗。問題なく
動いていたACM1602NIは昇天してしまいました。