hiro yamamoto works

マイコンハード、ソフトを作ったりしています。
お家や現場のお困りごと解決に!
内容利用は自己責任でお願いします。

基本は大事(コンパイルエラー)

2024-06-07 11:24:03 | ナレッジ_knowledge

こんなことがありました。笑ってやってください。

4年前に書いたスケッチが必要になり、書き込みしたらコンパイルエラーになって

"exit status 1
control reaches end of non-void function [-Werror=return-type]"
調べたら<br />void以外の関数で戻り値が無いと次のエラーとなる。<br />"戻り値"が必要ないこともありますが・・・<br /><code>return true</code>と入れたらコンパイル出来ました。
ちなみに
次のスクリーンショットArduino IDEの環境設定で"コンパイル"のチェックを外すとエラーになりません。<br />以前からチェック入れていて、エラーは出なかったと記憶しています。
でも、これからは正しいcodeを書くようにしたいと思います。


教えてもらいました(XIAO ESP32C3でWEPを使う時)

2024-05-23 20:57:45 | ナレッジ_knowledge

”古めのWi-Fiアクセスポイントを活用したい”とご依頼があったので、
google先生に聞いてみたら
ESP32で”WEP”を使う方法を見つけました。
感謝して使わせてもらいました。
WiFi.begin(ssid,password);の前に1行追加するだけで、
”WEP”アクセスポイントへ接続できるようになりました。
  WiFi.setMinSecurity(WIFI_AUTH_WEP); // Lower min security to WEP.
// or
//WiFi.setMinSecurity(WIFI_AUTH_WPA_PSK); // Lower min security to WPA.
  WiFi.begin(ssid, password);


教えてもらいました。(ESP32で現在時刻と時差時刻を使いたい時)

2024-05-06 12:00:20 | ナレッジ_knowledge

chatGPT先生に教わりました。

現在の時刻と一定の時間差を設けた時刻を使いたい。
サンプルスケッチ "ESP32"- "Time"-" SimpleTime"を使って改変点を載せます。
//void printLocalTime()の中に入れました。
  time_t now;//time_tは時刻を表すために使用される型 "time_t"型の"now"を宣言
  time(&now);//現在のUNIX時間を取得しその値をポインタ経由で変数"now"に格納
//中略
//以降は関数"void printLocalTime()"の最後の方に入れる
  //例として9時間前の時刻を取得する
  time_t some_hours_ago = now - 9 * 60 * 60;
  struct tm *some_hours_ago_info;//"some_hours_ago_info"構造体を宣言
  //'*'(間接参照演算子)ポインタが指し示すメモリ上の値を取得するために使用されます。
  //'&'(アドレス演算子)変数のアドレスを取得するために使用されます。
  
  //"->"[ポインタが指し示す構造体]のメンバアクセスする際に使用されます
  some_hours_ago_info = localtime(&some_hours_ago);
  
  //"some_hours_ago"というtime_t型変数のアドレスを渡している。
  //some_hours_agoが示すUNIX時間を地元時間に変換する
  //その地元時間の情報を格納した"struct tm"構造体へのポインタを返す
  //シリアルモニタへ表示してみる
  Serial.println(some_hours_ago_info->tm_year + 1900);
  Serial.println(some_hours_ago_info->tm_mon + 1);
  Serial.println(some_hours_ago_info->tm_mday);
  Serial.println(some_hours_ago_info->tm_hour);
  Serial.println(some_hours_ago_info->tm_min);
  Serial.println(some_hours_ago_info->tm_sec);
//以降変更なし省略



車載用アマチュア無線機の表示が点かない(電球切れ〜LEDへ交換)

2024-01-15 11:19:54 | ナレッジ_knowledge

今回は修理の事例です。
小径の電球を取り外しLEDへ変更します。電流制限抵抗も交換します。
車載用アマチュア無線機 TMー732 KENWOOD

部品(秋月電子通商)
I-01126 LED光拡散キャップ 3mm 白 (20個入)
I-17012 3mmウォームホワイトLED OSM5YK3Z72A (10個入)
1/6W510Ω2本
工具
サンハヤトのリードベンダー(MODEL RB-5)

操作表示部が分離できるタイプの無線機です。4芯のケーブルで本体と接続されています。
周波数などを表示する「ディスプレイが光らなくなった」というご依頼です。
(下の写真はLEDへ交換済みなので表示が見えます)

分解して調べてみると
照明電球は2個ずつ直列接続されて2回路あります。
回路ごとに1個ずつ切れていたので、全部点かなくなったようです。
インターネット検索では、トランジスタ(2SB1149)の故障事例も出てきましたが、
このユニットでは大丈夫でした。


表示液晶の周囲を覆っている金属製のカバーを外して、シールを剥がさないと
1個だけランプが抜けてきませんでした。

取り外した電球(電球ですものそりゃ切れますよ)

秋月電子通商で購入したLED(直径3ミリ)と光拡散キャップです。
リード加工は樹脂部にストレスをかけないように注意深く行う必要があります。
サンハヤトのリードベンダー(MODEL RB-5)で加工しました。
この距離がストレスかけない限界点かと思います。

サンハヤトのリードベンダーでTO-92の所が使えました。(MODEL RB-5)

ちょっと難しい、注意するところ

ランプよりLEDの直径が大きいため、どのランプ位置でも導光部やカバーに干渉します。
カバーを少し曲げる等の工夫が必要です。特にボリュームが取り付けられている側は、
奥まで入らないので、リードの曲げ方を工夫して基板に届くように(Uの字のようにとか)
する必要があります。注意 LED樹脂部にストレスをかけないようにするため、
曲げ位置をLED側へ寄せすぎない方が良いと思います。
Uの字リード曲げ加工・・・Lの字曲げ→Uの字を目標に曲げて、しの字ぐらいでカット
また、金属カバーとボリューム端子のショートを防止するため、外側面にポリイミドテープを
貼っておくと良いと思います。
前述のシールが貼ってあったランプ位置以外は、金属カバーを取り付けてから
作業したほうが良いかもしれません。

LEDを4個取り付けて抵抗を交換しました。
チップ抵抗の代わりにリード付き抵抗を取り付けました。
R8リードが接近するので、R5上にポリイミドテープを貼り付けました。
写真の左側LEDは、他の3個より挿入深さ浅めでリード追加工(Uの字)

参考 半透明な光を導き拡散させる部分(導光部と表現)

表示の明るさは調整の必要があるかもしれません。
510ΩでIF=10mA程度と思います。
暗ければ300Ωぐらい(20mA)までは抵抗を交換して調整可能と思います。

おわり


CANバスモジュールを使ってデータ送受信する(受信側復習)

2023-11-02 17:35:32 | ナレッジ_knowledge

しばらく放置していたら、自分の書いたスケッチがわからなくなったので、
ブログ投稿しながら復習することにしました。
送信側 SAMD XIAOとMCP2515 受信側 Arduino MKRZERO(SAMD)とMCP2515の組み合わせです。
私が使うための最低限の情報だけなので、もっと掘り下げたい方は詳しいサイトを探して下さい。
※テストしてわかったこと※
 理由はわからないが、送信側で、1byteの中で7bitしか使えない事がわかった。
受信側は送信側の7bitに合わせるしかありません。


Amazonで購入したCANバスモジュール
CANコントローラ(MCP2515)とトランシーバ(TJA1050)のICが載っています。

loop()関数中スケッチ抜粋

int packetSize = mcp.parsePacket();
  if (packetSize) {
    if (mcp.packetId() == packetId11) { //送信側IDと一致(packetId11)
      id11_value = 0;
      byte receivedData[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
      while (mcp.available()) { 
        for (int i = 0; i <= 7; i++) {//受信した0~8byteを配列に入れていく
          receivedData[i] = (byte)mcp.read();
        }//for
      }//while
      //receivedData[0]~[8]配列内のデータを処理して送信元データへ復元する
      for (int i = 0; i <= 7; i++) {//配列を順に呼んで
        id11_value |= (uint32_t)(receivedData[i] << (7 * i));//1byteの1〜7bitを使う時
        //配列内データを7bitビットずつシフトして、ビット単位のOR演算する
        //forループを8回(i=0から7)繰り返すと56bit復元される。
        //送信元データサイズに合わせてループ回数を決めれば良いと思う。
        //id11_value |= (uint32_t)(receivedData[i] << (8 * i));//1byteの1〜8bitを使う時
      }
      Serial.print("Value11 ");
Serial.println(id11_value);
    }


これで使えるかと思いますが、もっとシンプルなスケッチに出来るかもしれません。
間違いがあるかもしれませんのでご注意を

復習完了か?