Arduino PWM 再び

このところ,Arduinoをいじってます。PICに比べると遙かにわかりやすいです。ただ,PICに比べると,細か
な設定等が難しいのが欠点であるといえば欠点ですが。

今回は,ArduinoにもPWMの機能が備わっていますが,この機能を使わずに割り込みで,PWMを簡易的に実現してみました。PWMを実現するには,単純に,端子をLOWとHIGHTに切り替えることができればいいので,通常は,

   端子をHIGHT
   delay(50)
   端子をLOW

みたいにすれば,たやすく実現できます。ただ,このdelay(50)がちょっと気に入らないので,使わないで
実現できないかと考えた訳です。構想としては,TIMER割り込みの回数を数えて,

   0回目の割り込み→→端子をHIGHT
   n回目の割り込み→→端子をLOW
   規定の回数の割り込みで,また,0から数えるLOW

組み込みのPWMでも,レジスターレベルでカウントして,考え方としては,上記のものと同じ考えでやってる
ようです。

arduinoで,やってみました。LEDがだんだん明るくなると次は次第に暗くなるというスケッチを描いてみまし
た。

#include<avr/io.h>
#include <avr/interrupt.h>
int k=0;
int n=0;
void setup() {
  pinMode(13, OUTPUT);


  TCCR1A  = 0;
  TCCR1B  = 0;
  TCCR1B = bit(WGM12) | bit(CS11) | bit(CS10); // CTCモードで分周率64
  TIMSK1 = bit(OCIE1A); // 割り込みをタイマー1に設定
  //TCCR1B |= (1 << WGM12) | (1 << CS12);  //CTCmode //prescaler to 256
  OCR1A   = 11-1;
  //TIMSK1 |= (1 << OCIE1A);
}


ISR (TIMER1_COMPA_vect) {
 if(k<100){
    k=k+1;
  }
  else{
    k=0;
    digitalWrite( 13, HIGH);
  }
  if(k==n){
    digitalWrite( 13, LOW);
  }
}


void loop() {
   while(n<100){//だんだん明るくする
    n=n+1;
    delay(25);
  }
   while(n>1){//だんだん暗くする
    n=n-1;
    delay(25);
  }
 
}

動作している様子です。時々,ちらつきがあります。LEDで動かしていますが,もしかして,これで,モー
ターを制御するとばたついたりするかもしれません。

Arduino—再び(4)–LCD Keypad Shield

あれこれやって、思った動作ができるようになりました。やろうとしてたのは、arduinoで、リニアステージの
ステッピングモーターをパルスを送ることで動かすことでした。今回は、TB6600というドライバーを経由し
て、制御しました。結線等は、例によって、諸兄のHPを参考にしました。
このドライバーには、

     ENA- ⇒⇒デジタル11番ピン
     ENA+ ⇒⇒5V

     DIR- ⇒⇒デジタル12番ピン
     DIR+ ⇒⇒5V

     PUL- ⇒⇒デジタル13番ピン
     PUL+ ⇒⇒5V

の6本の接続が必要ですが、プラス側に接続してもマイナス側に接続しても動くようでしたが、aruduinoで
は、+端子は一律5Vに落として、-の端子の方をそれぞれに結線しました。TB6600の内部配線がどうなって
るのか気になるところです。

動作させているところです。パルスを設定して、SELECTボタンで動かしてます。パルスの数値を+と-の設定にすることで、反対の方向に移動させてます。

今回は、別な面で苦労しました。YouTubeの設定が変わったのが、埋め込みリンクの書いてあるところが分からず、時間ばかりかかりました。分かるとなんのことはない、自分の動画の再生画面で、右クリックをするとその項目があり、分かった時は、がっかりしました。

とりあえず動いたarduinoのスケッチアップします。例によってデバックように入れておいたserial.print等の残ったままのものです。

Arduino—再び(3)–LCD Keypad Shield

ほぼ目的のプログラム(スケッチ--arduinoではこう呼ぶみたいですね。)ができました。難しいものではな
く、入門編によくあるようなLチカ(LEDを点灯させる)のプログラムと大差ありません。ただ、キーの読み取
りをアナログの変化で読み取っているので、安定しない部分があるのか、長押しの判別がどうしても、できま
せんでした。

               押されたキーの判別
                    │
          ┌───────────────────────┐
    UPキーが押された⇒⇒ +1の処理    UPキーが長押しされた⇒⇒+10の処理

のようにしたかったのですが、あきらめて、+10の処理は、RIGHTキーに割り当てました。 スケッチでは、

   キー判別の関数の呼び出し
      
   呼び出されたそれぞれキーの回数をカウントする
      
   カウントが一定以上になったら、キーに応じた処理をする。

という単純なことを、メインのLOOPのなかで、繰り返してるだけです。「回数をカウント」の部分はなくても
いいのですが、一応チャタリングの対策です。
入力した数字をLCDに表示するのに数字の桁数が違ってしまうと、正しい表示がされないので、左詰めで表示
できるように簡単な関数を作りました。文字数を取得する関数が準備されてますが、その書式がどちらかとい
うとエクセルのVBAのような感じで、ちょっと戸惑いました。PICのC言語だと目的の文字を括弧の中にいれる
のですが、ピリオドで連結するようでした。このへんの細かい文法は、その都度調べないとだめですね。

   arduinoの記述  s.length( )  (sが長さを求める文字)
   PICのC言語記述 sterlen(s)   (sが長さを求める文字) 

“Arduino—再び(3)–LCD Keypad Shield” の続きを読む

Arduino—再び(2)–LCD Keypad Shield

LCD Keypad Shield が届いたので、あれこれはじめました。

諸兄のプログラムをお借りして、動かしてみました。すんなりと動きましたが、LCDの表示で、明るさの調整がボリュームで必要でした。
 ただ、KEYの読み取りで、判別条件の調整が必要でした。諸兄の物と届いた物では、抵抗値が違うのだと思いますが、下記赤字部分のように、アナログの読み込みの値の修正をしました。

     int read_LCD_buttons(int adc_key_in){
          if (adc_key_in > 1000) return btnNONE;
          if (adc_key_in < 50) return btnRIGHT;
          if (adc_key_in < 150) return btnUP;
          if (adc_key_in < 300) return btnDOWN;
          if (adc_key_in < 600) return btnLEFT;
          if (adc_key_in < 750) return btnSELECT;
          return ERRORR;
     }

この辺は、メーカーの違い、個体値の違い、等によって調整が必要なようです。このアナログ値の調整をする
にあたっては、諸兄の作成されたプログラムが都合がよかったです。キーごとの電圧が表示されますので、そ
れをみながら、調整ができます。私はそのまま使いましたが、表示が電圧ではなくて、アナログの読み取り値
だともっと楽だと思います。また、標準のライブラリーとは、LCDのピンの配置が多少違うので、下記のよう
に、ピンの表示の部分の変更も必要でした。これは、別の諸兄のHPに記載がありました。

     #include LiquidCrystal
      lcd(8, 9, 4, 5, 6, 7);

LCDの表示用にデジタルの、8,9,4,5,6、7、キーの判別ようにアナログのA0のピンを使用していますので、ユーザーはそれ以外のピンしかつかえません。基盤の裏のパターンをたどってみると、

写真の緑黄色矢印から、

 13,12,11,3,2,1,0

の並びで、デジタルのピンを取り出せるようです。また、アナログは、本体右下のピンヘッダーから、

のように、

 1,2,3,4,5

のアナログのピンを取り出せるようです。

大捜索をするようですが、部品を収納した、ケースにピンヘッダーがあったように記憶してますので、探しだして、取り付けたいと思ってます。

Arduino—再び(1)–LCD Keypad Shield

しばらく前にArduinoを使って、フライス用にDROの表示用のものを作成しました。また、備忘録をかねて、
Arduinoをいじりはじめました。LCDと外部入力(キーパッド)のものがほしかったので、いろいろ調べまし
た。
スイッチサイエンスのLCDシールドは手元にあったのですが、これは、

外部入力ができないので、〇zonで、LCD Keypad Shieldくぐると、600円~5000円のものが引っかかりました。LCD 1602でくぐると、600円から30000円と幅広いものが引っかかります。30000円のもの買う方いるのかなと疑問に思ってしまいますが、もちろん、安い物をポチリました。

ただ、ポチったものには、ピンへダーがついてないので、後付けするようかなと思います。2700円だいのものには、ピンヘッダーが付いていますが、高いですね。

これらのシールドには、5個のkeyが付いていますが、どうやって、判別をしてるのかと思いましたが、
keyの配線図がのってました。

抵抗を介して一つのポートに接続しているようですが、どうやって判別するのか、くぐってみると、どうや
ら、電圧の違いで判別してるようでした。
KeyPad用のライブラリーには、

  iuint8_t LiquidCrystal::readButtons(void) {
    int adc_key_in = analogRead(0);
     // read the value from the sensor
    // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
    // we add approx 50 to those values and check to see if we are close
    if (adc_key_in > 1000) return 0x00;
    if (adc_key_in < 50) return BUTTON_RIGHT;
    if (adc_key_in < 195) return BUTTON_UP;
    if (adc_key_in < 380) return BUTTON_DOWN;
    if (adc_key_in < 555) return BUTTON_LEFT;
    if (adc_key_in < 790) return BUTTON_SELECT;
    return 0x1F; // when all others fail, return this…   }

のように記述があり、アナログで電圧の変化によって、判別してるようでした。使用上の注意に接点経年劣化やチャタリング等の対策がソフトの方で必要だとの記述もありました。

芝生の草取りをしています。

この2年間,芝生の手入れは,芝刈り程度で,なかなか手入れができずにいました。やっと,手入れができるようになり毎日のように草取りをしています。ブルーベリーの周りに,名前はわからないのですが,緑の小さな草がびっしり生えてしましました。

ほって置くとどんどん増えるので始末が悪いです。名前は,わかりませんが,後でグーグルレンズでしらべてみようと思います。この草は,地下茎でつながっていて,勢力を見る間に伸ばしていきます。手入れができなかった時は,芝刈りのついでに,刈払機で,根こそぎ刈り取っていましたが,茎が残っていて,少したつと又伸びてしまいます。
この草は,ブルーベリーの周りにびっしりはえています。赤で囲ったところは,すでに根っこからとったところです。

まだ,青で囲った部分がのこってますので,地道にやる予定です。芝草取り用のフォークで,芝を掘り返すようにして,根っこにアクセスしてなるべく根っこや地下茎をとるようにしてます。

この草は,地下茎を伸ばして,根っこをはやしたところから新芽がでてきます。

新芽が伸びたところが成長して,写真のような,新芽が何本かあつまったような株状のもになるようです。

ダイダイ矢印のように他のものと地下茎でつながっています。 この草を取るときは,なるべく根っこと茎をとるようにしてます。そうすれば,増えるのを少しでも減らせるかなと思ってます。

本日,グーグルレンズでこの草の名前を確認してみましたが,特定することができませんでした。

どなたかご存じの方いるでしょうかね。

12月1日,やっと残りが写真の部分だけになりました。

でも,終わった後から,新芽がでてきます。取り残してる地下茎から出たのだと思います。

草取りができるようになり,毎日のようにやってますが,全文取り終わらないうちに,既に取ったところにまた,新しい草でのびてます。

一通り終わったても,すでにとったところを,また,取るようです。でも,一度終わったところは,カタバミが少なくなってるので,比較的楽かなと思います。

12月3日 残っていた一角の草もやっと取り終わりました。

もう少しで,一通り草取りが終わるので,最初に戻って,後から生えてきた草をまた取るようです。

arduino+Android端末+bluetooth で DRO (TouchDRO)

 やっと長い冬眠から目覚めました(笑)
 ちょっと面倒になって,ブログの更新をしていませんでした。
 その間も,いろいろあさってましたが,ある海外のサイトで,
 arduinoを使って,Android端末をDROにする記事がありました。
 いろいろくぐって,オープンソースでプロジェクトを作成してる

 HPにたどりつきました。

 まねしてみようと思い,あれこれもがきました。ブレッドボードで,

 

 写真のような回路で実験しましたが,次の動画のような
 結果がでましたので,また,備忘録がてらまとめておこうと
 思います。

 回路図は,前掲のHPの冒頭にありますので,簡単に作成できる
 はずです。

 

  (HPよりお借りしました。)

 部品は下記の記述がありました。

   R1-R3   Resistor, 10K 3
    R4      Resistor, 330 Ohm 1
    R5      Resistor, 220 Ohm 1
    C1-C3   Capacitor, ceramic, 0.1uF 3

 思うようにいかなかったのは,USBのコネクターもピンアサインで。
 あれこ調べました。

 

 写真と回路図は,VCCとGNDが逆なので,注意が必要でした。
 それと,

    「D+」・・・・・・・・「Z-3」(データ)
    「D-」・・・・・・・・・「Z-2」(クロック)

 ようになってますので,ここも要注意かなと思います。

 写真の「ID」は,無結線です。
 それと,BLUETOOTHのアダプターですが,当初 HM-18 という
 のを使いましたが,Android端末と接続が持続できないので,
 HC-5 という物に交換しました。aruduinoとの接続で,分圧等
 で,電圧落とす必要があるのかなと思いましたが,直結で
 大丈夫でした。

 

 USBのコネクターも,HC-5のBLUETOOTHも●ZONから購入
 しました。

 プログラムは,MSP430LaunchPad用とarduino用があるようで,
 記載されているHPも違うようです。

     MSP430用プログラム
     aruduino用スケッチ
  スケッチは,HPの下の方にあります。

  Android端末用のアプリは,
  Google Play

 から入手できます。
 私は,フライスのZ軸に使ってたDROが調子悪くなり,
 時々数値が飛ぶようになったので,新しい物に交換しましたので,
 調子の悪いものて実験しました。また,Android端末は,家の
 が前に使ってたArrows NX なる古い携帯をつかいました。

 AndroidのエミュレータをPCに入れてやってみましたが,
 BLUETOOTHの設定がうまくいかず,動きませんでした。
 実験で使ったスケールはiGagingの古いものですが,新しいものにも対応し
 ているようで,基盤そのものの販売もあるようです。
 基盤を購入して,つなげばそれでできますので,
 その方がてっとりばやいかもですね。でも高い。
 互換品等使えば,DROが安く設置できるかもですね。

旋盤メンテ カミソリの制作 (4)

 横送り台の部分改造---浮き上がり防止---
 カミソリを作ってますが,材料の切り出しのため,バイスをセット
 しました。一度セットすると,平行だしが面倒なので,バイスで
 作業できることをすすめました。
 当初の計画と違って,横送りだいの上?の方のアリ溝を
 15mmほど切斯いて,そこにカミソリを抱き込むようなな部品を
 セットする改造を行いました。

 

 今回はフライスを使って加工しましたが,0.1mm程度の精度で,
 作ることができました。
 ==========================
 これ以上精度を上げるのは,大変だと思いました。
 小さなエンジンを作られている方のHP見た記憶ありますが,
 1/100mmがどうのとか書かれていたような気がします。
 私には,今のところ0.1mmの精度がいっぱいでしょうね。
 ==========================
 受けのところと接触する面も,手でさわっても段差なくセットでき
 ました。ただ,セットの具合で,0.1mm程度の隙間ができたようです。

 

 2種類のカミソリを作ることになりますが,片面切削した段階で
 切り離せばこの部品の部分の台形のカミソリはできます。
 それほど手間かからないかなと思います。
 カミソリの調整には,六角ボルトを使いますが,場合によっては,
 この部分,ノブ付きのボルトに変更してもいいかなと思います

 

 果たして,浮き上がり防止の効果はいかほどでしょう?
 縦送り台?の方にも同じ加工をしたいのですが,ここには,
 DROがつくので,思案中です。
 今回は,バンドソーのアップrグレーで以前いらなくなったオリジナル
 のテーブルの角をきりだして,ちょうどL字型になるので,
 それを使いました。

旋盤メンテ カミソリの制作 (3)

 カミソリの試作品ができました。

 

 従来のものより一回り大きくしました。

 

 上の金色のものが試作品で,セットして,固定用のネジをしめて,
 跡をつけた物です。
 まあ,まあ,のできですが,前回(2)の記述で,固定用に両端を
 削りましたが,ちょっと,削りすぎました。そのため,反対側の
 切削をするのに,上下反転させて固定したときに,両脇をつよく
 しめたため,ワークが中央で,上方に膨らんでしましました。
 マイクロメーターで計測すると,中央部で,0.2から0.3の
 膨らみがありました。
 制作の手順の見通しがつきましたので,明日本番をします。
 固定用のジグも,両端での固定でしたが,あらたに中央でも固定
 できるように,ふやしました。

旋盤メンテ カミソリの制作 (2)

 治具をフライスにセットしました。
 端面に段をつけ,端面を一度フライスでなぞりました。
 赤矢印です。
 これで,多分,平行出ししなくて済むはずです。

 

 カミソリの制作に使うのは,10mm角の快削真鍮です。
 最初に,押さえの部分の高さを,セットする刃物台の隙間の高さ
 より,わずかに低めに削りました。
 この部分は,実際の使用では,カットする部分ですが,
 隙間の高さよりた高いと,試しにセットするのに邪魔になるための
 カットです。

 

 フライスもびびりまくりで,切削面があれてます。
 重量感のあるフライスほしいいですが,宝くじ当たらないとだめ
 ですね。(笑)
 ワークをセットしました。

 

 今日の作業はここまで。
 平行して木工もやってるので,
 なかなか進みません。