satotsuのいろいろつくってみた日記

いろいろつくってみたあれこれの記録。

esp32の時刻合わせをntpでやってみる。

esp32のサンプルスケッチで時計を動かせたので、時刻も合わせたくなった。

こちらを参考にさせていただく。

qiita.com

 

はまったのが、wifiに接続するところ。

何回WiFi.status()やってもWL_NO_SSID_AVAILが返ってくる。

scanしたら見つけてるので、見えないわけではないみたい。。

statusの内容はここの.hファイルを参照。

github.com

 

結果的には、beginの前にdisconnectするとできた。

しばらく繋がらなかったら、またdisconnectしてbeginする。

WiFi.disconnect();
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

macでesp32のoledひからせるまで。

これ届いた。さっそく開発環境をととのえるよー。

ja.aliexpress.com

まずはGithubからesp32の設定とってきて、USBドライバをインストールする。

qiita.com

たぶんうちのはESP 32 Dev Moduleじゃなくて、Heltec_WIFI_LoRa_32でいいはず。

スケッチの書き込みにはボタン押してモード変更してやる。

-> [RST]押しながら[PRG]押して、[RST]を離せばおK。

 

コンパイラでBLEが無効とかでるのは特に問題なさそうだけど。

ここからダウンロードして、esp32フォルダに置けば出なくなる。

github.com

 

で、びんぼうでいいのと同じようにOLED動かそうとするも動かない。。

スケッチ書き込み前はちゃんと動いてたので、ハード的には問題ないはず。

あとシリアルはなんか吐き出してるので、i2cまわりがあやしそう。

 

Aliでみてみた。SDAが4,SCLが15らしい。

https://ae01.alicdn.com/kf/HTB1hdmKSpXXXXbMXFXXq6xXFXXXR.jpg?size=188590&height=599&width=1000&hash=9ae2381838511582087d4c5a7912a60d

なので、SSD1306 display(0x3c,4,15);でうごくはず。 動かない。。

 

結局、ここでまんまのボードとサンプルがあったので試す。これは動いた。

robotzero.one

 

#include "SSD1306.h"でやるときは、setup()で、

// put your setup code here, to run once:
  pinMode(16, OUTPUT);
  digitalWrite(16, LOW); // set GPIO16 low to reset OLED
  delay(50);
  digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 to high
  Wire.begin(4, 15);
  display.init();

  display.flipScreenVertically();

ってやると動いた。16pinがみそらしい。

macでelectronいれるまでのめも。

mac(osx el capitan 10.11.6 )にelectronいれるまでのめも。

node.jsを最初にpkgでいれたけどうまくいかずに結構はまった。

 

nodenvでnode.jsをいれる。今回は安定の8.9.4で。

joppot.info

 

electronをいれる。sudoつけるとうまくいかない。でもこれはいらないかも。

npm install electron -g

 

gitでサンプルひろってきて動かしてみる。動く。ヽ(=´▽`=)ノ

masaru-sasaki.sakura.ne.jp

macでsinatraインストールするまでめも。

まずはhomebrewいれる。

brew.sh

次にrubyをいれる。とりあえず2.4.1で。(2.4.3とか2.5.0でもいいかも。)

qiita.com

うまく入らないのでここを見る。

qiita.com

 やっとこさsinatraのターン。

qiita.com

で、myapp.rbにhello world描いて実行。

ruby myapp.rb

とりあえず動く。で、何するか。。

esp32でwifiやるときのめも。

qiita.com

 

qiita.com

blog.boochow.com

買ったやつ。

ja.aliexpress.com

arduinoで相補PWMだしてみる。

arduinoでも相補PWM出せるよね。ということで試してみた。

 

これが一応最終形。オシロが1chしかないので、PWMの出力2つをつまんでる。

deadtimeと相補PWMでてるっぽい。1kHz。

f:id:msatotsu:20171229204739j:image

 

でも信号の切り替わりを拡大してみると、変なレベルがでてる。-2.5Vくらいのやつ。なんだこれ。

f:id:msatotsu:20171229205034j:image 

 

こいつのせいで、10kHzでdeadtimeを0にしても変な段つき波形になる。。

f:id:msatotsu:20171229205133j:image

 

一応ソースのせとく。timer1を使ってる。

 

#include <avr/io.h>
#include <avr/interrupt.h>

void PWM_init(uint8_t ch, uint8_t N, uint16_t top) {
// 0:in, 1:out, DDRB,DDRD: DIO, DDRC: AnalogIn
// timer0->PD6,5, timer1->PB1,2, timer2->PB3,PD3
DDRB = DDRB | B00000110;


// COM1x1,COM1x0: duty, 10: OCR1/TOP, 11:1-(OCR1/TOP)
TCCR1A = TCCR1A & ~(bit(COM1A1)|bit(COM1A0)|bit(COM1B1)|bit(COM1B0));
TCCR1A = TCCR1A |bit(COM1A1)|bit(COM1B1)|bit(COM1B0);
TCCR1B = (TCCR1B & B11100000) | bit(WGM13) | N;

TCNT1 = 0;
TIMSK1 = bit(TOIE1);
ICR1 = top;
OCR1A = 2000; // deadtime 0.5us -> 0.5us/50us*800=8
OCR1B = OCR1A - 1000;
}

void setup() {
noInterrupts();

TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;

PWM_init(1, 1, 8000);

interrupts();
}

 

void loop() {
// put your main code here, to run repeatedly:

}

arduinoめも

今さらだけど、arduinoってなんだっけとか、タイマとか割り込みってどうなってるんだっけ、とか気になるのでめも。

 

arduinoは、AVRに基板とIDEをセットにしたものみたい。

AVRのことではなかった。ハードはなんとオープンソース

だからびんぼうでいいのとかできるんだね。

Arduino - Wikipedia

 

タイマーは、AVR自体はtimer0,1,2あるんだけど、arduinoでは、

MsTimer2 → ms

TimerOne → us

でアクセスするらしい。あれ?timer0は??

miso-engine.hatenablog.com

 

 タイマの関数の引数に呼び出す関数を入れるみたい。

 ちなみに割り込みベクタは固定。優先度高い順に、timer2,1,0。

 

タイマとピンの対応はこちらを参考にさせていただく。

そうそう、◯◯といえば : Arduino の PWM と タイマーと tone() 関数

 

IOアクセスが遅そうというのはその通りで、ここで調べてる方がいた。

digitalWriteおそい。でも144kHzでるなら、往復7usくらいなので普通は問題ないかも。

ehbtj.com

 

どうしたら良いかというと、digitalWrite使わずに、レジスタ直接書き換えたらいい。

というか、こちらの方がわかりやすいと思うのは自分だけではないはず。。

cammy.co.jp

 

ならタイマもレジスタ書けばいろいろできるんでは。

と思ったら、ものすごくわかりやすくまとめてるところがあった。感謝。

analogWrite()[Arduino 1.0.5]

 

こちらも参考に。

usicolog.nomaki.jp

 

タイマ割り込みのこと忘れてた。ここを参照させてもらお。

makers-with-myson.blog.so-net.ne.jp

 

割り込み要因はこちらで。

usicolog.nomaki.jp