ラベル 電子工作 Arduino Japanino の投稿を表示しています。 すべての投稿を表示
ラベル 電子工作 Arduino Japanino の投稿を表示しています。 すべての投稿を表示

2025年1月17日金曜日

aitendoのUSB-C対応Arduino UNO互換マイコンボード ★2023★びんぼうでいいの [U3R2023C] でプチ嵌り

年末に都内に行った際にaitendoで購入したUSB-C対応Arduino UNO互換マイコンボードを購入しましたが、罠が……
  • USBCtoCケーブルの差し込みに表裏あり
  • 電源ON確認用の ONランプ が明るすぎる
  • マイコン差し込みソケットの向きが逆
  • ま、どれも分かってりゃ無問題のプチ嵌り


    とりあえずUSB-Cコネクタの固定するハンダが不足気味だったので足すついでに、邪魔なDCジャックを取っ払う
    USB-C対応Arduino UNO互換マイコンボード BINBODEIINO-C

    昔々ファームウェアを書き込んで保管していたATMEGA328の向きを確認し、ATMEGA328の1番ピン側の凹と、マイコンボードのソケット側の凹と確認し差し込み
    USBシリアルブリッジチップがCH340GなのでシリアルポートドライバのCH340/CH341のドライバーをダウンロードして、ノートパソコンにインストール

    ◆マイコンの電源が入らない
    USB-CtoCケーブルでノートパソコンに接続するも電源入らず

    電源電圧を見るも電源来ていない
    接触不良かとUNO側のUSB-Cケーブルを裏返して刺してみるとONランプとLランプが点灯
    PC側のケーブルは裏返しても変わらず、マイコンボード側のUSBコネクタ差し込みだけ表裏があるようだ

    他のUSB-CtoCケーブルを試しても同じ挙動で再現性があったものの、PC側がUSB-AのUSB-AtoCケーブルの場合はマイコン側の差し込みに表裏は無ありませんでした

    これ、マイコンボード側USB-Cコネクタ端子のCC1,CC2の処理が良くないと起こるやつ

    老眼でパターンをちゃんと調べる気が起きないのだけれども、ぱっと見はCC1,CC2それぞれに5.1kΩが独立して繋がっているから問題無いように見えるのだけれども?

    ま、マイコン側のコネクタの差し込みを裏返せば使えるし無問題


    USB-C対応とみせかけてCC1、CC2の接続がオープンでUSB PD電源だと使えない製品が時々ある


    ◆ONランプが明るすぎる
    ONランプが明るすぎて 目がーーー となり上から紙テープを複数枚貼り付け減光させる


    ◆プログラムの書き込みができない
    とりあえずサンプルのBlinkをそのまま書き込んで動作確認するも書き込みが終わらず……

    ATMEGA328の1番ピン側の凹と、マイコンボードのソケット側の凹を確認して差し込んだのだけれども、マイコンの差し込み向きが逆の気が?

    他のUNO互換ボードを確認すると、ソケットの凹の位置が逆向きだった

    ATMEGA328の差し込み方向をソケットと逆にすると
    Lランプが点滅を始める
    保管してあったのはファームウェアを書き込んで、サンプルのBlinkを書き込んで動作確認まで済ませたマイコンだったようだ

    無事使えるようになる

    2023年3月25日土曜日

    フリーズするまでは使えていたArduino 2.0.3が起動できなくなる

    ファイルサイズがMEGAでもギリギリになるレベルの3Dプリンタ用のファームウェアをArduinoでいじっている最中にフリーズしてしまう。強制終了させ再起動したところ、画面の真ん中でArduinoマークが点滅が延々と続く状態のまま立ち上がらなくなる。
    Arduino2.0.4起動しない
    ソフトが壊れたのかと、アンインストールして、ついでに新しいver2.0.4にアップデート。zip版とか、インストーラー版を試すも変わらず。

    同様のトラブルが起きていないかと検索してみると、プロキシの設定とか、とあるJavaファイルがーーーとかいうのは出てくるんだけど、そもそもプロキシ使っていないし、Javaの不具合のあるバージョンでもないし、別のPCでは同等の設定で起動している。
    そもそもフリーズする前までは動作してたので関係ないでしょうと。
    Ver1.8.19は使えるの困らないと言えば困らない事もあり、よく分からないのでしばらく放置。


    しばらくして、たぶん設定系のファイルが壊れたせいだろうと思い立ちVer2.x系の設定ファイルの入っている「.arduinoIDE」を別フォルダーにコピーしてバックアップの上、「.arduinoIDE」ごと削除。
    Arduino設定dファイル削除
    Arduinoの起動時に新しい設定ファイルが作成され無事起動。
    ボードの指定やらなんやらの設定は全部飛びましたが、たいした設定をしているわけでは無いのでいいや、と。



    蛇足
    ネットワークがプロキシ接続の環境で別のPCに新規インストールしたところ同様の画面で止まり起動できない状態になる。同じ環境でVer1.*.*系はアップデートはできないものの起動は出来て使用可能なのだけれども。

    そのネットワークでのプロキシの設定は「自動構成スクリプトを使用する」の場合以外無く?Ver1.*.*系は自動構成スクリプト時の設定があるようなのだけれど、Ver2.*.*は???
    ただし、そのネットワークはVer1.*.*系で自動構成スクリプトを設定してもサーバーに接続できないようでアップデート出来ず、設定が悪いのか?環境が悪いのか?ソフト不具合?接続ポートの設定?不明。

    そこで、一度プロキシのない環境でインターネットに接続した状態で起動したところ、起動中にマイコンボード接続用ドライバーのインストールが2つほど動き無事起動する。
    その後はアップデートはできないものの起動は出来て使用可能な状態になる。

    エラーも出ないし、プロキシ接続も罠すぎる。

    2022年2月23日水曜日

    Arduino UNOでパルスコンバーター(周波数コンバーター)を試作して、ATTYNY85に移植する

    パルス入力のパルス立ち上がり間隔に対し、換算係数をかけた割合のパルス間隔でデューティ比50%のパルス出力に変換するパルスコンバーターのスケッチ。


    壊れた旧式のタコメーターにステッピングモーター式のタコメーターから内部部品を移植をするのにタコパルスとかの間隔を変換して騙くらかしてそれっぽく誤魔化せないかと、Arduinoを使って周波数を一定割合で増減するプログラムが無いかと探してみたものの見つけられなかったので、自作するしかないか?と考える。

    ハード的な接続はUnoの場合、パルスの入力ピンが3、出力ピンが12という設定で、パルスの電圧は入出力共に5V。
    (出力でよく使われるピン13はArduino起動時に内蔵LEDを点滅させる信号が流れたり、接続されている内蔵LEDが電気的に悪さをする時があるので、LEDの点灯目的以外での使用はできるだけしないようにしている。)
    ピンが余りまくりなので、ATTYNY85あたりでもできそうな気はする?

    ただし、このプログラムは入力が0Hz付近だと、発振してしまったり、0Hzになる前の値が残ったりする、バグがあるので車速の変換には使えないと思う。
    ま、数Hz以下は出力しないようにするの条件分岐を追加すればいいだけの気がしなくもない???

    中ほどにある「PulsWidth_Adj」の値を変えるとパルス幅の増減割合を変更可能。サンプルはパルス幅を0.9倍して、周波数が約1割増えるようにしています。
    
    #define PulsInput_PIN 1  //pin3(int.1)
                              // attachInterrupt(interrupt, function, mode)
                              // Uno: pin2(int.0) pin3(int.1)
                              // Leonardo: pin3(int.0) pin2(int.1) pin0(int.2) pin1(int.3) pin7(int.4)
    const int PulsOut = 12;  // the number of puls output pin
    
    unsigned long previousMicros = 0;
    unsigned long currentMicros = 0;
    long OUT_interval = 0;
    int OutPuls_State = LOW;
    
    unsigned long dTime = 0;
    unsigned long lastTime = 0;
    
    
    void setup() {
      attachInterrupt(PulsInput_PIN, PlusWidthCounter, RISING);
      pinMode(PulsOut, OUTPUT);
    }
    
    void loop() {
      const float PulsWidth_Adj = 0.9;  //パルス幅の変換係数
    
      currentMicros = micros();
      OUT_interval = dTime /2 * PulsWidth_Adj;
      
      if (currentMicros - previousMicros >=  OUT_interval) {
        previousMicros = currentMicros;
    
        if (OutPuls_State == LOW) {
          OutPuls_State = HIGH;
        } else {
          OutPuls_State = LOW;
        }
    
        digitalWrite(PulsOut, OutPuls_State);
      }    
    }
    
    void PlusWidthCounter() {
      unsigned long t = micros();
      dTime = t - lastTime;
      lastTime = t;
    }
    


    周波数を1割増加させるためにパルス幅を0.9倍。30Hzの入力で出力33.3Hzは普通の4気筒のタコメーターパルスで1000rpm相当

    出力333Hzで10000rpm相当。この周波数で、この精度ならばアナログメーターの針では誤差範囲かと。

    入力周波数を上げながら見ていた感じでは、ざっくり出力周波数で800Hzのあたりが限界?ま、24000rpm相当、絶対使うことはなさそうだ。
    ここから上になると、徐々に処理落ちが増えてくるようで出力周波数の増加割合が下がっていき、最終的には入力周波数より出力周波数のほうが低く、パルス幅もマチマチな状態になっていき、10kHzまで行くと出力パルスの幅が明らかにバランバラン。


    ちゃんと動いているのかを確認するために、多目に出力を振り追加計測

    PulsWidth_Adjの値を4にして、パルス幅を4倍にしてみる。入力が297.6Hzで出力が74.85Hzで周波数は1/4ぐらいなので狙い通り。

    PulsWidth_Adjの値を0.25にして、パルス幅を1/4にしてみる。入力が297.4Hzで出力が1136Hzで周波数は3.8倍ぐらい。出力周波数が高くて処理が追い付いていない?
    確認のため入力周波数を落としてみる。
    PulsWidth_Adjの値を0.25でパルス幅を1/4のまま入力を200.0Hzに変更すると出力が793.7Hzで周波数は約4倍。やはり、このプログラムとハードでは出力800Hzぐらいが処理の限界のようだ。



    入力が0Hz付近で出力が発振する問題は、出力が5Hz以下の場合は強制LOW張り付きにする条件分を追加したことで大丈夫と思われる?ちなみに閾値を2Hz設定にしたらうまくいきませんでした。ま、タコメーター用に使うならば元のプログラムでも問題なさそうだけど?
    ついでに周波数の高い発振も出力もしないように出力周波数800Hzを超えた場合も強制0張り付きにして上限も切っておく。

    
    // attachInterrupt(interrupt, function, mode)
    // Uno: pin2(int.0) pin3(int.1)
    // Leonardo: pin3(int.0) pin2(int.1) pin0(int.2) pin1(int.3) pin7(int.4)
    #define PulsInput_PIN 1
    
    const int PulsOut =  12;             // Puls output pin
    int OutPuls_State = LOW;
    unsigned long previousMicros = 0;
    unsigned long currentMicros = 0;
    long OUT_interval = 0;
    
    unsigned long dT1 = 0;
    unsigned long lastTime = 0;
    
    void setup() {
      attachInterrupt(PulsInput_PIN, PlusWidthCounter, RISING);
      pinMode(PulsOut, OUTPUT);
    }
    
    void loop() {
    const float PulsWideth_Adj = 0.9;  //パルス幅の変換係数
    
      currentMicros = micros();
      OUT_interval = dT1 /2 * PulsWideth_Adj;
    
      if (OUT_interval <  625) {
          OutPuls_State = LOW;          // HiCUT OUT_interval 625us 1周期1250us = 800Hz 
        } else if (OUT_interval > 100000) {
          OutPuls_State = LOW;          // LowCUT OUT_interval 100000us 1周期200000us = 5Hz
        } else if (currentMicros - previousMicros >=  OUT_interval) {
          previousMicros = currentMicros;
    
          if (OutPuls_State == LOW) {
            OutPuls_State = HIGH;
          } else {
            OutPuls_State = LOW;
          }
    
        digitalWrite(PulsOut, OutPuls_State);
        }    
      }
    
    void PlusWidthCounter() // interrupt handler
    {
      unsigned long t = micros();
      dT1 = t - lastTime;
      lastTime = t;
    }
    



    堕話

    勢いで作り始めたものの・・・。
    最初は、出力パルスを作るのにLEDの点滅と同じように「delay」を使ったところdelay中は決まった時間を待っている以外は何も出来無いせいで?出力パルス幅がメタメタになり、delay無しに改修。更に取得したパルス幅を周波数に計算しなおして、換算係数かけて、またパルス幅に計算しなおして出力なんて処理をさせていたら、無駄な掛け算割り算が増えて処理が重たくなり、周波数が上がるほどパルス幅のバラツキが大きくなり、出力が安定せず(下記に書いた、マイコンのせいもあるかも?)ので、単純にパルス幅を、増減するだけにする。
    (掛け算はオーバーフローの危険があるし、割り算や小数点のある掛け算は処理が重い、割り算でも2の倍数ならシフト演算を使えば早いけど、使わないで済むなら使いたくない。)

    結局、いろいろなプログラムを参考にさせてもらいつつ、"attachInterrupt"を使用しパルス間隔を取得するプログラムを参考に、取得した入力パルスの立ち上がり時間間隔に、変換したい割合の係数をかけて、Arduinoのチュートリアルにある"Blink Without Delay"をベースに変換した幅のパルスを出力させる、というように切った張ったで、プログラムはなんとか形になる。


    最初は表面実装タイプのUno互換機を使用していたのですが・・・。
    出力パルス幅が安定せず。

    他の方が公開している、同じ割り込み処理を使用しているタコメーターとかのソースを見ても、パルス幅から回転数への変換するのに割り算したり、表示用のLEDやLCDの処理もしているのに問題ないようだし、それに比べても重たい処理をしているわけではないのだけれども?と、配線を確認したり、ソースいじったり半日ほど無駄にする。
    USB Bのケーブルを探すのがメンドクくて使っていなかったDIP版を試してみたところ安定して動くようになる。

    どちらも328Pを16MHzで動かしているし、ヒューズ設定も一緒だし、普段は表面実装タイプのUNO互換機を使っていろいろと試していますが特に問題が出たことはなかったのだけれどな~。


    Arduino UNOで作成したパルスコンバーターをATTINY 85に移植。(とりあえず入力周波数が50Hzでしか動作を確認していないので周波数が変わったらだめなところが有るかも?)


    ArduinoにATTinyCore というライブラリーを追加して、移植の確認。書き込みはUsbasp経由でブートローダーなし設定で書き込みをする。
    入出力のピン設定を変えて、クロックが16MHzから8MHzと半分になるので出力上限周波数を400Hz(4気筒のタコメーター入力でで12000rpmぐらい)変えただけで、移植というより、ほぼコピペ。ま、入出力で使用するピン設定でのプチ嵌りはありましたケド。


    一頃よく使用していた同じ8ピンATTINYの13Aと、ピン配置・機能は一緒だろうと13Aを使用しいていたときのメモ書きを見ながら使用するピンを決めて動かそうとしたところ出力パルスが出てこない orz

    ATTINYはArduino環境だとピン入力割り込み使えないの?と調べても良くわからず、ATTINY85のデータシートを見たところ、INT0が振り分けられているピンが13Aと違うということがわかる。
     ATTINY 85 PB2(Pin7)
     ATTINY 13A PB1(Pin6)
    しかも
     #define PulsInput_PIN 0
      |
     const int PulsOut = 2;
    なんていうような設定をしたので、Pin6から入力してPin7出力と設定にしたつもりが、Pin6から入ってPin6に出力という矛盾した設定にしているし。動くわけないじゃんと。
    これでもエラーは出ないので、たぶん後ろにある初期化のほうが有効になっていたのですかね?

    ま、横着しないでデータシートを確認すれば良かったわけで・・・。
    const int PulsOutを 0 に変更して、Pin7から入ってPin5に出力される設定に変更する。

    ATTINY85とATTINY13Aは、メモリー容量が違うだけの互換マイコンではないのだと今頃知った。
    13Aで作成していて、どうしてもプロフラムサイズが収まらなくなり、85に変更なんていうのがありがちですが、各ピンの機能からクロックから似ているようで微妙に違い・・・。

    
    // attachInterrupt(interrupt, function, mode)
    //ATTYNY13A Pin6(int.1)
    //ATTINY85  Pin7(int.0)
    #define PulsInput_PIN 0
    
    const int PulsOut =  0;             // Puls output pin 7
    int OutPuls_State = LOW;
    unsigned long previousMicros = 0;
    unsigned long currentMicros = 0;
    long OUT_interval = 0;
    
    unsigned long dT1 = 0;
    unsigned long lastTime = 0;
    
    void setup() {
      attachInterrupt(PulsInput_PIN, PlusWidthCounter, RISING);
      pinMode(PulsOut, OUTPUT);
    }
    
    void loop() {
      const float PulsWidth_Adj = 0.9;  //パルス幅の変換係数
    
    
      currentMicros = micros();
      OUT_interval = dT1 /2 * PulsWideth_Adj;
    
      if (OUT_interval <  1250) {
          OutPuls_State = LOW;          // HiCUT OUT_interval 1250us 1周期2500us = 400Hz 
        } else if (OUT_interval > 100000) {
          OutPuls_State = LOW;          // LowCUT OUT_interval 100000us 1周期200000us = 5Hz
        } else if (currentMicros - previousMicros >=  OUT_interval) {
          previousMicros = currentMicros;
    
          if (OutPuls_State == LOW) {
            OutPuls_State = HIGH;
          } else {
            OutPuls_State = LOW;
          }
    
        digitalWrite(PulsOut, OutPuls_State);
       }    
    }
    
    void PlusWidthCounter() {
      unsigned long t = micros();
      dTime = t - lastTime;
      lastTime = t;
    }
    



    最後にボリュームを追加し、A/D変換で読み込んだ値で変換幅を0.75~1.25倍の間で調整出来るようにして、クロックが半分の8MHzになるので上限のカット周波数を変更。
    クロックが下がっているのに処理を追加したせいか出力200Hzあたりから出力が不安定になっている感じ?内蔵クロックのRC発振使用で精度が悪いのかも?外付けクロック追加して16MHzに改修したほうがいいかも?
    ピンの設定の関係で、今ボリュームの読み込みに使用しているpin2をクリスタルへの接続に使わないといけないので、調整機構をやめるか、禁断のresetピンを入力に割り当てるか?となり面倒なので、動かして駄目だったら考えようかと?
    記憶が間違っていなければ、resetを入出力に割り当てると高電圧書き込みモードしか使えなくなるので扱いがめんどくさくなる。

    
    // ATTYNY13A Pin6(int.0)
    // ATTINY85  Pin7(int.0)
    #define PulsInput_PIN 0        // Pin7, Puls input
    
    const int PulsOut =  0;        // Pin5, Puls output 
    int OutPuls_State = LOW;
    float sensorValue = 0;           // variable to store the value coming from the sensor
    
    
    float PulsWideth_Adj = 0;
    unsigned long previousMicros = 0;
    unsigned long currentMicros = 0;
    long OUT_interval = 0;
    
    unsigned long dT1 = 0;
    unsigned long lastTime = 0;
    
    void setup() {
      attachInterrupt(PulsInput_PIN, PlusWidthCounter, RISING);
      pinMode(PulsOut, OUTPUT);
    }
    
    void loop() {
    //sensorValue = analogRead(sensorPin);
    sensorValue = analogRead(A3);       // Adj pin 2(PB3,ADC3)
    PulsWideth_Adj = 0.75 + sensorValue/2000;
    
      currentMicros = micros();
      OUT_interval = dT1 /2 * PulsWideth_Adj;
    
      if (OUT_interval <  1000) {
          OutPuls_State = LOW;          // HiCUT OUT_interval 1000us 1周期2000us = 500Hz 
        } else if (OUT_interval > 100000) {
          OutPuls_State = LOW;          // LowCUT OUT_interval 100000us 1周期200000us = 5Hz
        } else if (currentMicros - previousMicros >=  OUT_interval) {
          previousMicros = currentMicros;
    
          if (OutPuls_State == LOW) {
            OutPuls_State = HIGH;
          } else {
            OutPuls_State = LOW;
          }
    
        digitalWrite(PulsOut, OutPuls_State);
       }    
    }
    
    void PlusWidthCounter() {
      unsigned long t = micros();
      dTime = t - lastTime;
      lastTime = t;
    }
    

    2022年1月29日土曜日

    JUNK 1行16文字? LCD GE4194HBをArduinoに接続してみる

    ArduinoでLCDに文字を表示させようとJUNK箱を漁っていたらいつ購入したかも覚えていない、裏に「GE4194HB」と書いてある1行16文字表示のLCDが出てくる。
    たぶんaitendoあたりでJUNK扱い100円とか、そんな感じで売っていたモノだったような?

    「GE4194HB」で検索してみるもデータシート等の情報は見つからずピン配置とか不明。でも、パラレル接続のLCDでは一般的な14ピンのスルーホール穴が開いているので他のLCDと同じで動かせるだろうと、裏側を見てみたところ、何かがおかしい?

    他のLCDと比べてみると
    上下左右が逆っぽい

    上下を合わせるとこんな感じ。このタイプの14ピンパラレルLCDで右側にデータ用の端子付いているLCD初めて見たよ(罠)(勘違い!!下方参照)

    ピンアサインは、GNDとVoの場所から推測するにこんな感じ

    Arduinoのサンプルコードをもとに16文字1行の設定にして動かしてみるも「hello, w」までの8文字しか表示されない
    接続端子のピン配置の推測は合っていたけれど、端子側が右側ではなく、左側で電源が上側に配置という、罠が発覚。

    とりあえず最低限の接続に変えて、電源とコントラスト調整用のボリュームだけ繋いで表示させてみても8文字分の■しか表示されず
    電源とコントラストしか繋いでいない状態から8文字なので初期化シーケンスとか関係しないハードの不具合?壊れている?と、もう一つ同じものを購入していたのでそちらも同様に最低限の接続で確認すると、同様に8文字しか出ませんでした。ということは仕様? 1行16文字と見せかけて1行8文字という罠???

    ふと、昔使用したことがある「ACM0802C-NLW-BBH」の時も1行■表示が出て、1行8空白なんてことがあったなと思い出し
     Japaninoへの8x2行LCD液晶モジュール ACM0802C-NLW-BBHの接続に悩む
    ちゃんと初期化すれば16文字表示出せるのか?と

    調べると16文字1行LCDはコスト削減で使用ICを減らすのに内部的には8文字2行と同じになっている事が多いようで、内部的に左8文字が1行目、右8文字が2行目扱いになっているらしい?

    プログラムを見直し
    無事「hello, world!」が表示できました。

    罠だらけ (^●^)


    表示確認に使った参考ソース
    ArduinoのライブラリにあるLiquidCrystalのサンプルソースをベースに、1行16文字液晶対応にしたもの。(8文字2行と同じ。)
    
    // include the library code:
    #include <LiquidCrystal.h>
    
    // initialize the library by associating any needed LCD interface pin
    // with the arduino pin number it is connected to
    const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
    LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
    
    void setup() {
      lcd.begin(8,2);  //内部的には8文字2行
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("hello, w");
      lcd.setCursor(0, 1);
      lcd.print("orld!");
    }
    
    void loop() {
    }
    

    2017年4月28日金曜日

    ATMEGA328P、ATTINY 13A等のAVR用高電圧ライター STK500クーロンな互換ライターをAtmel Studio7.0で使ってみる

    チップのクロック設定を変えようとしたりしてFuse設定を間違えたり、ResetピンまでIOに使おうとしたりヒューズ設定を変えてしまうとISP(ICSP)書き込み経由の書き込みが出来ず、プログラムの書き換えできなくなるという事があります。この場合、高電圧プログラミングに対応したライターでヒューズ設定を書き換えるか、Arduinoあたりを使ったヒューズリセッターの作例を参考にチップを書き換える必要がある。

    調べるとWindows10でも使える高電圧プログラミングに対応したライターは
     ATMEL AVRスタータキットSTK500
    というATMEL純正のライター兼、テストボードがあるとのこと。ただし、1万円以上するのでこれを購入するなら、ATTINY13Aなら200個以上、ATMEGA328Pでも40個以上購入できてしまうじゃん!!と

    そこで互換機の作例を参考に自作しようかと考えたものの、必要な部品が思ったより必要な感じで手持ちのJUNK品をなるでく使用しても3000~5000円のパーツ購入費は必要になりそう?で、組み立てKITでもないかと、開けゴマして洞窟探検宙にSTK500クーロンな互換ライターを2000~5000円ぐらいで見つけ、マイコン買ったほうがいいという考えが何処かにすっとぴ衝動買い。

    何種類かあったのですが送料込み3000円ぐらいだったTX_STK500(VER6.1)というものを購入。



    ■Atmel Studio7.0(Microchip Studio)とTX_STK500を接続する
    Atmel Studio7.0を起動して使ってみたところAVRISP mkIIは自動認識されたものの、STK500互換機は認識されずデバイスリストにもない。調べるとAtmel Studio6.0あたりから?手動で追加しないといけなくなったとのことで、デバイスを追加してやる。

    事前にボードをPCに接続しUSB-SERIALドライバーのインストールを済ませ認識させておく必要があるのですが、ここで一難有ってPL-2303HXはWindows10用正式なドライバーが無いということで、罠に嵌ったり・・・。

    「View → Available Atmel Tools」から


    右側の画面のところで右クリックして「Add Target...」


    「Select Tool」「STK500」


    Comポートを選ぶ。ComポートはUSBの挿し口が変わると変わるので要注意。

    これでボードの接続設定が終了。


    メニューの右上にあるICの上に雷のマークのある「Device Programming」から
    Tool、Device、Interfaceを選んで「Apply」を押そうとしたところで反応せず???


    いろいろと試した結果、PL2303-HXのドライバーとしてMicrosoftのUSB-Serialドライバーを使ってたのが不具合の原因だったようで
     PL2303_Prolific_DriverInstaller_v130.zip
    を使うことでOKになる。


    ■Atmel Studio7.0とTX_STK500をHVPPモードでATMEGA168Pのヒューズ設定を読み書きしてみる
    ボード上のICソケットや、J7に接続したICの読み書きが可能になる



    ■Atmel Studio7.0とTX_STK500でATMEGA168Pのヒューズ設定を読み書きしてみる
    HVSP接続時とは違い、PCとボードをUSB接続した際に一手間必要でPCと接続してすぐに赤色LEDのパイロットランプが2度点滅するのでその間に、ISPモード切替スイッチを押す(押しっぱなしにする必要はない)

    これでISP端子に対応した機器に書き込みが可能になる。J3を接続すると外部ターゲットに5Vの供給が可能になる



    ■avrdude-GUIとTX_STK500をHVPPモードでATMEGA168Pのヒューズ設定を読み書きしてみる
    「Programmer」に「Atmel STK500 V2 in parallel programming mode(stk500pp)」を選ぶ


    ちなみにHVSP設定の「Atmel STK500 V2 in high^voltage serial programming mode(stk500hvsp)」を選ぶととエラーで使えませんでした。



    ■avrdude-GUIとTX_STK500をISPモードでATMEGA168Pのヒューズ設定を読み書きしてみる
    ISPモードで接続し「Programmer」に「Atmel STK500(stk500)」を選ぶ

    2017年3月29日水曜日

    avrdude-GUIを起動しようとしたら0xc000007bエラーで使えなくなる

    久々に32bitのWindows7のノートPCで、Attiny13AのFuse設定を変更するためにavrdude-GUIでusbaspを使用しようとしたら
     アプリケーションを正しく起動できませんでした(0xc000007b)。[OK]をクリックしてアプリケーションを閉じてください。
    というエラーで使えない状態になっていた。
    アプリケーションを正しく起動できませんでした(0xc000007b)。[OK]をクリックしてアプリケーションを閉じてください。

    0xc000007bについて検索をしてみると、.NET Framework 2.0が必要だの、Microsoft Visual C++ Redistributable Package をインストールしないと駄目だの・・・。64bitのプログラムがナンタラとかで、対策を試みるも治らずorz


    以前は問題なく使えていたので、その間に変更した事といえばArduinoのソフトを1.6.?にアップデートした際にusbasp経由のプログラム転送でエラーが出て書き込めなくなり、回避策でusbaspのドライバーを
     zadig_2.2.exe
    で、
     libusbK USB Drvices
    に変更したぐらい??? avrduteの起動に関係ない気がしなくもなくもないけど、他に思いつくことが無く!?

    ダメ元でZadigでusabaspのドライバー変更を試みるもデバイスが何も表示されず??? "Options→List All Devices" でデバイスを全部表示させ
     libusb-win32(v1.2.6.0)
    に変更してみたら、avrdudeでの0xc000007bエラーが消え、無事Fuse設定の書き換えが終了。
    これで解決?と思ったらarduinoからUsbasp経由のプログラム転送がエラーで出来ず orz

    arduinoが使えないのは困るので、再度zadigでドライバーを
     libusbK USB Drvices
    に戻したところ、arduinoもavrdudeのどちらでもエラーが出なくなる。

     解決はしたものの・・・。理解不能。

    間にlibusb-win32(v1.2.6.0)のドライバーを挟んだ事で何かの設定が変わったんですかね???

    2016年8月28日日曜日

    aitendoのびんぼうでいいの(S) [U3S]で、プチ嵌り

    aitendoのびんぼうでいいの(S) [U3S]を入手しました。



    USBコネクターがマイクロUSBなのでLeonardo互換かと思ったら、UNO互換。

    互換と言いつつも、シリアルのインターフェースICが純正で使っているFTDIとかのものではなく、
     CH340G
    という中華系のUSBシリアル変換チップという違いがあり、別途ドライバーをインストールする必要があります。最近、安いArduino系互換機や、USB-232Cケーブルを購入するとたいていCH340系のチップなので、むしろFTDIよりこっちのほうが主流?


    封を開けたところ・・・。


    クリスタルのケースがつぶれてっし (T_T)

    動けばどうでもいいんですけどね。
    ダメでもJUNKから取り外して交換すればいいやと


    サンプルのライブラリーから、ありきたりなBlinkを書き込んでみるも、なんかエラーがorz


    Arduino:1.6.11 (Windows 10), ボード:"Arduino/Genuino Uno"

    最大32,256バイトのフラッシュメモリのうち、スケッチが928バイト(2%)を使っています。
    最大2,048バイトのRAMのうち、グローバル変数が9バイト(0%)を使っていて、ローカル変数で2,039バイト使うことができます。
    C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM3 -b115200 -D -Uflash:w:C:\Users\tfksw\AppData\Local\Temp\build9c9ef3bdfe2fccb480bc6e4bac749e41.tmp/Blink.ino.hex:i

    avrdude: Version 6.0.1, compiled on Apr 15 2015 at 19:59:58
    Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
    Copyright (c) 2007-2009 Joerg Wunsch

    System wide configuration file is "C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf"

    Using Port : COM3
    Using Programmer : arduino
    Overriding Baud Rate : 115200
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xf8
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0xf8
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0xf8
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0xf8
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0xf8
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0xf8
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0xf8
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0xf8
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0xf8
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xf8

    avrdude done. Thank you.

    マイコンボードに書き込もうとしましたが、エラーが発生しました。
    このページを参考にしてください。
    http://www.arduino.cc/en/Guide/Troubleshooting#upload

    「ファイル」メニューの「環境設定」から
    「より詳細な情報を表示する:コンパイル」を有効にすると
    より詳しい情報が表示されます。



    最近似たようなエラーで困った w なと、クリスタルが壊れているか、最初からブートローダー壊れているの?と思いつつaitendoの公式ページを確認したら
     びんぼうでいいの(S) [U3S]
    そもそもブートローダーが書き込まれていないという事実が判明 (^^;

    ついでに、マイクロUSBコネクターの半田もやり直す必要があるようだ。

    USBコネクターの半田をやり直すついでにISCP(ICS)も取り付けUSBaspでブートローダーを書き込み完成。

    クリスタルつぶれたままだけど、動いたからいいやと

    Arduino1.6.11で、USBasp経由の書き込みがWIndows10ドライバー署名のエラー52で使えなくなる

    USBケーブル経由でArduinoへの書き込みができるようになったかと思ったら、今度はUSBasp経由で転送しようとしたらエラーが orz



    Arduino:1.6.11 (Windows 10), ボード:"Arduino/Genuino Uno"

    最大32,256バイトのフラッシュメモリのうち、スケッチが948バイト(2%)を使っています。
    最大2,048バイトのRAMのうち、グローバル変数が9バイト(0%)を使っていて、ローカル変数で2,039バイト使うことができます。
    C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -cusbasp -Pusb -Uflash:w:C:\Users\tfksw\AppData\Local\Temp\build9c9ef3bdfe2fccb480bc6e4bac749e41.tmp/Blink.ino.hex:i

    スケッチの書き込み中にエラーが発生しました
    avrdude: Version 6.0.1, compiled on Apr 15 2015 at 19:59:58
    Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
    Copyright (c) 2007-2009 Joerg Wunsch

    System wide configuration file is "C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf"

    Using Port : usb
    Using Programmer : usbasp
    avrdude: error: could not find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp'

    avrdude done. Thank you.

    「ファイル」メニューの「環境設定」から
    「より詳細な情報を表示する:コンパイル」を有効にすると
    より詳しい情報が表示されます。



    Arduino:1.6.10で出ていたavrdudeのエラーかと思ったのだけど、USBaspが見つかんない???

    デバイスマネージャーを確認したところエラー


    しばらく問題なく使っていたんだけど? と、詳細を見たら

    このデバイスに必要なドライバーのデジタル署名を検証できません。ハードウェアまたはソフトウェアに最近加えられた変更により、正しく署名されていないファイルや破損したファイルがインストールされた可能性があります。また、出所の不明な悪意のあるソフトウェアであることも考えられます。 (コード 52)


    数日前まで使えていたのに・・・。SmartScreenを切って、Shift+再起動 で再起動のオプションに入り署名の強要を止めてドライバーを再インストールで問題ないように見えても、再起動するとまたエラー52

    心当たりがあるとすると


    KB3176934は、PowerShellがらみのようなので無関係かと。一応アンインストールしてみましたが変化無し。なので
     Windows 10 Version 1607 for x64-Based Systems 用更新プログラム (KB3176936)
    が、悪さをしていそう?なのだがアンインストールできない・・・。かと言って、一番怪しいAnniversary Update後しばらくは使えていたので、ほかに思い当たるものは無く???


    って、書いている最中にアンインストールしたばかりのKB3176934を勝手にダウンロードしていたし、不具合あって更新を強制的に削ってもマイクロソフトが不具合と思っていなきゃ、Windows10Homeだと無限ループに嵌る可能性がある??? しかも未署名のドライバーの無効化は不具合ではなく、マイクロソフトが意思を入れてやっているらしく改善されない気がする。
    というわけで、Windows10 64bit は、マイコンとか、ガジェット遊びには向かない???


    Zadigというソフトを経由してドライバーをインストールしたら使えるようになりました。

    2016年8月20日土曜日

    Arduino1.6.10と、Arduino UNO R3と、その互換機にプログラムが転送できなくなる

    無駄なトラブルシューティングを書き連ねて長くなったので、結果を先に書くと
    USB経由で書き込めなくなった原因は、しばらくISP(ICPS)経由でファイルを転送していたのでブートローダーが無効になっていました (^^;
    何年Arduino使ってんだーと w

    ブートローダーが有効かどうかを見分ける方法は
    電源投入直後に基板上にあるD13に接続の繋がLEDが高速に数回点滅するかどうかで見分けることが可能で、点滅すればブートローダーが有効で、点滅しなければ無効。
    と判断できる。

    蛇足
    ブートローダーが有効の場合点滅後に書き込んだプログラムが実行されるので電源投入から実行までにちょっと遅延がある。
    それに対し、ISP経由で書き込むとブートローダーが無効になるので、すぐにプログラムが実行される。その代わりに純正のUSBケーブル経由の書き込みが出来なくなる。

    電源入れるとすぐにプログラムが実行されるし、書き込みの手間は変わらないしでUSBaspで書き込みするようになったんだったと、思い出す (^^;




    帰省中の暇つぶしにCH340という中華チップの載ったArduino UNO互換機を持って帰り、プログラムを転送しようとしたら
     avrdude: stk500_recv(): programmer is not responding ・・・
    とかいうエラーで書き込めず・・・。
    書き込みプログラムを定番のサンプルプログラムのBlink(Lチカ)にしてみるも相変わらず同じエラー。

    でも、Get Board infoでレスポンスがあるのでシリアル通信自体はできているハズ。


    んで、レスポンスがどうのというエラーなので、リセットがうまく動いてない?と、タイミングを変えて手動リセットを試すもダメ。

    前にうまく動いた時から変わったといえば・・・。
    OSが、Windows10 64bitなのは同じだけど、anniversary updateを当てたのと、Arduino:1.6.10にアップデートしたこと。

    試しにVer.1.6.9や、Ver.1.6.8に戻してみるも変わらず。帰省中の使用はあきらめる orz



    家に戻り、正規品のArduinoUNOで試すも結局同じエラーで、試しにUSBaspを使いICSP、ISP経由で書き込もうとしたら今度は別のエラー orz
    Ver.1.6.11が出ていたのでアップデート。Ver.1.6.10は、avrdude周りで不具合が出ていたらしく古いのに戻したようだ?
    これで、USBasp経由での書き込みはできるようになったが、USBポート経由の書き込みは相変わらずエラー orz

    PCを変え
     Windows10 anniversary update 32bit + Arduino1.6.11
    で試したけれども変わらない orz

    anniversary updateを疑っているのだけどもロールバックで戻すのめんどくさいし、また入れることを考えるとやりたくない。

    ま、USBasp経由で書けば使えるから当面はそれでいいやと (^^;



    ちなみにエラーはこんな感じ・・・。


    Arduino:1.6.11 (Windows 10), ボード:"Arduino/Genuino Uno"

    最大32,256バイトのフラッシュメモリのうち、スケッチが948バイト(2%)を使っています。
    最大2,048バイトのRAMのうち、グローバル変数が9バイト(0%)を使っていて、ローカル変数で2,039バイト使うことができます。
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x28
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x28
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x28
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x28
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x28
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x28
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x28
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x28
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x28
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x28
    マイコンボードに書き込もうとしましたが、エラーが発生しました。
    このページを参考にしてください。
    http://www.arduino.cc/en/Guide/Troubleshooting#upload

    「ファイル」メニューの「環境設定」から
    「より詳細な情報を表示する:コンパイル」を有効にすると
    より詳しい情報が表示されます。



    追記
    オリジナルのUNO R3や、UNO R3互換機は全滅。
    検索をしてみても同じ状況の人は少ないようで???その上、通常のFAQに埋もれていて。ありきたりの答えが返ってて・・・。

    気分転換に、ほかの種類のボードで試したら、問題なくファイルの転送ができました。
    UNO系でも最近ブートローダーを自分で焼いた表面実装(SMD)な中華互換機は、ファイルの転送ができる。

    問題なかったもの
     MEGA互換機(CH340Gの載った中華ボード)
     Nano互換機(CH340Gの載った中華ボード)
     UNO R3(SMD)互換機(CH340Gの載った中華ボード)

    ダメだったもの
     UNO R3(DIP)正規品
     UNO R3(DIP)互換機(CH340Fの載った中華ボード)


    ブートローダーが無効になっていると分かり、USBaspを使いICSPポート経由でブートローダーを書き込んだところ、無事プログラムが転送されるようになる。

    2015年12月13日日曜日

    密林の奥地で見つけた380円のArduino互換Digisparkモドキのスケッチ転送で嵌る

    目的物のをカートに入れた後に暇つぶしで密林をさまよっていたら、DigisparkっぽいArduino互換マイコンを380円なんて価格で見つけたので、思わすついで購入をしてしまう。

    基盤の角は、ポートに入れやすいようにヤスリで整えました。

    コピー品?互換品?のようで、LEDの色が本家は緑のようなのですが、赤です。

    基本的な設定は、
    公式Wiki
    を見て「File → 環境設定」や、「ツール → ボードマネージャー」の中身を書いてあるとおりに設定し、ドライバーも入れ、ボードも「Degispark(Default-16.5MHz)」に設定。


    USB-HIDとして認識されるという噂もありますが、デバイスマネージャーを確認しても良くワカラン特殊なデバイスとして認識されているので、シリアルポートの設定はありません。



    んで、スケッチを書き込もうとしたら、コンパイルでワーニングが出まくっているようだけどなんとかコンパイルは終わり、でも書き込みがタイムアウト。
    ソフトのバージョンや、ボードのドライバーの入れ直し、別のボードを選んでみたり、差し込むUSBポートの変更等してみたものの、相変わらずタイムアウト orz

    数日悩んだ結果、オイラの英語力ではWikiの説明が理解できていなったのが原因でした(^^;)

    問題は、この一文
    You do not need to plug in your Digispark before invoking upload
    (アップロード待ちになるまで、デジスパークデバイスは差し込む必要はない。)

    を、USBポートににボードを差しっぱなしでいいものと勘違いして、差しっぱなしのまま書き込もうとしていたのが問題でした。


    こう書いてくれれば間違えなかったのに・・・。
    You do not plug in your Digispark before invoking upload
    (アップロード待ちになるまで、デジスパークデバイスは差し込むな。)

    つまり、コンパイルが終わりったところで「60秒待ってるから、その間にデバイスを挿入してくだい」的な案内表示
     Running Digispark Uploader...
     Plug in device now... (will timeout in 60 seconds)
     > Please plug in the device ...
    が出てから、ボードを差し込む必要がある。

    この画面になるまで、挿入するのは待ちましょう。


    無事転送完了。

    相変わらずコンパイル中に警告が出まくってるけど動いているからいいか~(Arduino Ver.1.6.6にバグがあるようで、Ver.1.6.5にしたらワーニングは消えました)