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

2021年1月14日木曜日

M5Stick CでWiFiのRSSI表示

先日、WiFi信号の強度が知りたくて、
M5Stick Cを使ってWiFi受信RSSIを表示するスケッチを作りました。
元はこのスケッチです。
元のスケッチは時間と日付を表示するスケッチで、
それを少し改造して、
RSSIも表示するようにしました。
また、OTAアップデートもできるようにしました。

WiFiのSSIDとパスワード、タイムゾーンを入力をconfig.hファイルに以下のように記入しました。
#define TIMEZONE     9
#define WIFI_SSID   "your_wifi_ssid"
#define WIFI_PASSWORD   "your_wifi_password"


ボタンA(M5と書いてあるボタン)を押せば表示のオン・オフが切り替えられます。
ボタンB(上の小さいボタン)を2秒以上長押しすれば時間シンクロが行われます。
 
実際のスケッチは以下です。改造した結果、timeToDoという関数は必要なくなりましたが、そのまま残しました。
-----------------------------------------------------
#include <Arduino.h>
#include <M5StickC.h>
#include <ESPmDNS.h>
#include <WiFi.h>
#include "time.h"
#include "config.h"
#include <ArduinoOTA.h>

// default hostname if not defined in config.h
#ifndef HOSTNAME
  #define HOSTNAME "m5stickc"
#endif

// use the WiFi settings in config.h file
char* ssid       = WIFI_SSID;
char* password   = WIFI_PASSWORD;

// define the NTP server to use
char* ntpServer =  "ntp.nict.jp";

// define what timezone you are in
int timeZone = TIMEZONE * 3600;

// delay workarround
int tcount = 0;

// LCD Status
bool LCD = true;

RTC_TimeTypeDef RTC_TimeStruct;
RTC_DateTypeDef RTC_DateStruct;

//delays stopping usualy everything using this workarround
bool timeToDo(int tbase) {
  tcount++;
  if (tcount == tbase) {
    tcount = 0;
    return true;    
  } else {
    return false;
  }  
}

// Syncing time from NTP Server
void timeSync() {
    M5.Lcd.setTextSize(1);
    Serial.println("Syncing Time");
    Serial.printf("Connecting to %s ", ssid);
    M5.Lcd.fillScreen(BLACK);
    M5.Lcd.setCursor(20, 15);
    M5.Lcd.println("connecting WiFi");
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    Serial.println(" CONNECTED");
    M5.Lcd.fillScreen(BLACK);
    M5.Lcd.setCursor(20, 15);
    M5.Lcd.println("Connected");
    // Set ntp time to local
    configTime(timeZone, 0, ntpServer);

    // Get local time
    struct tm timeInfo;
    if (getLocalTime(&timeInfo)) {
      // Set RTC time
      RTC_TimeTypeDef TimeStruct;
      TimeStruct.Hours   = timeInfo.tm_hour;
      TimeStruct.Minutes = timeInfo.tm_min;
      TimeStruct.Seconds = timeInfo.tm_sec;
      M5.Rtc.SetTime(&TimeStruct);

      RTC_DateTypeDef DateStruct;
      DateStruct.WeekDay = timeInfo.tm_wday;
      DateStruct.Month = timeInfo.tm_mon + 1;
      DateStruct.Date = timeInfo.tm_mday;
      DateStruct.Year = timeInfo.tm_year + 1900;
      M5.Rtc.SetData(&DateStruct);
      Serial.println("Time now matching NTP");
      M5.Lcd.fillScreen(BLACK);
      M5.Lcd.setCursor(20, 15);
      M5.Lcd.println("S Y N C");
      delay(500);
      M5.Lcd.fillScreen(BLACK);
    }
}

void buttons_code() {
  // Button A control the LCD (ON/OFF)
  if (M5.BtnA.wasPressed()) {
    if (LCD) {
      M5.Lcd.writecommand(ST7735_DISPOFF);
      M5.Axp.ScreenBreath(0);
      LCD = !LCD;
    } else {
      M5.Lcd.writecommand(ST7735_DISPON);
      M5.Axp.ScreenBreath(255);
      LCD = !LCD;
    }
  }
  // Button B doing a time resync if pressed for 2 sec
  if (M5.BtnB.pressedFor(2000)) {
    timeSync();
  }
}

// Printing WiFi RSSI and time to LCD
void doTime() {
  //if (timeToDo(1000)) {
    vTaskDelay(1000 / portTICK_PERIOD_MS);
    M5.Lcd.setCursor(10, 10);
    M5.Lcd.setTextSize(1);
    M5.Lcd.printf("%s: ", WiFi.SSID());
    long strength = WiFi.RSSI();
    if(strength < -70) M5.Lcd.setTextColor(RED, BLACK);
    else if(strength < -60) M5.Lcd.setTextColor(YELLOW, BLACK);
    else M5.Lcd.setTextColor(GREEN, BLACK);
    M5.Lcd.printf("%02d\n", strength);
    M5.Lcd.setTextSize(3);
    M5.Lcd.setTextColor(WHITE, BLACK);
    M5.Rtc.GetTime(&RTC_TimeStruct);
    M5.Rtc.GetData(&RTC_DateStruct);
    M5.Lcd.setCursor(10, 25);
    M5.Lcd.printf("%02d:%02d:%02d\n", RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds);
    M5.Lcd.setCursor(15, 60);
    M5.Lcd.setTextSize(1);
    M5.Lcd.setTextColor(WHITE, BLACK);
    M5.Lcd.printf("Date: %04d-%02d-%02d\n", RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Date);
  //}
}

void setup() {
  M5.begin();

  M5.Lcd.setRotation(1);
  M5.Lcd.fillScreen(BLACK);

  M5.Lcd.setTextSize(1);
  M5.Lcd.setTextColor(WHITE,BLACK);
  timeSync(); //uncomment if you want to have a timesync everytime you turn device on (if no WIFI is avail mostly bad)

  // Port defaults to 3232
  // ArduinoOTA.setPort(3232);

  // Hostname defaults to esp3232-[MAC]
  ArduinoOTA.setHostname(HOSTNAME);

  // No authentication by default
  // ArduinoOTA.setPassword("admin");

  // Password can be set with it's md5 value as well
  // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
  // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

  ArduinoOTA
    .onStart([]() {
      String type;
      if (ArduinoOTA.getCommand() == U_FLASH)
        type = "sketch";
      else // U_SPIFFS
        type = "filesystem";

      // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
      Serial.println("Start updating " + type);
    })
    .onEnd([]() {
      Serial.println("\nEnd");
    })
    .onProgress([](unsigned int progress, unsigned int total) {
      Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
    })
    .onError([](ota_error_t error) {
      Serial.printf("Error[%u]: ", error);
      if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
      else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
      else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
      else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
      else if (error == OTA_END_ERROR) Serial.println("End Failed");
    });

  ArduinoOTA.begin();
}

void loop() {
  M5.update();
  buttons_code();
  doTime();
  ArduinoOTA.handle();
}
------------------------------------------------------------

2020年12月12日土曜日

ラスベリーパイ4のブートアップデバイス順番を変更

またものメモ書きです。
今回はラスベリーパイ4のブートアップ順についてです。

ブートアップデバイスの順番を変えるには、このコマンドを実行する。
sudo -E rpi-eeprom-config --edit
 
これで今の設定が開きます。
BOOT_ORDER=0xf14
を追加すれば、ブートアップ順はまずUSB、そしてmicroSDになります。
 
BOOT_ORDER=0xf41
にすれば、ブートアップ順はまmicroSD、そしてUSBになります。
 
ちなみに、ラスベリーパイ400も同じようにできるはずです。

2019年11月8日金曜日

初めて国際eパケットを使用しました

今日、初めて日本郵便の国際eパケットを使用しました。


意外と簡単です。
オンラインで専用サイトにて専用袋を注文します。
そして、同じサイトにてラベルを作成します。
ラベルはPDF形式なので、印刷した後、PCに保存することもできます。
で、ラベル印刷、ラベルを切り、送り状を専用袋に入れます。
(サインを忘れず!)
パッケージ、ラベルを郵便局に持って行って、窓口で計量、支払い、完了!

ラベル作成は初めてなので、約10分ぐらいかかりました。
でも、送り主登録ができますので、なれたら、たぶん2分ぐらいかな(宛先、内容の入力)。

ちなみに、送ったパッケージはMRR ESPAという3Dプリンター制御基板です。
MRR ESPAに関するポスト1 ポスト2 ポスト3 ポスト4 ポスト5
商品ページ

2019年9月16日月曜日

MRR ESPA:近日Kickstarterにて公開!

自分で設計したESP32マイクロコントローラーを使用した3Dプリンター制御基板MRR ESPAが間もなくKickstarterにて公開されます。

思いついたのが約一年前です。
この一年間、勉強しながら何回も試行錯誤して、やっと本日にたどり着きました。


上記のビデオではMRR ESPAがインストールされたEnder-3という3DプリンターがPETGを使用して水槽飾りを印刷中です。

WiFi機能が搭載されていますから、パソコンやスマートフォンやタブレットのブラウザーから操作できます。
専用のコントローラーは不要です。
専用のアプリも不要です。
そして、遠隔操作もできます。
とても便利です!
ちなみに、このウェブUIはESP3Dです。

2019年8月16日金曜日

VIVITAシンガポールを訪問

昨日、一時帰国した時、シンガポールにあるVIVISTOP Orchardを訪問しました。
この場所はVIVITAのシンガポール「支店」です。
日本では千葉県柏市の柏の葉にVIVISTOP Kashiwanohaがあります。

子供を自由にものを作る場所で、新しく解説したシンガポール「支店」はまだまだ来場者が少なかったです。
機械や設備も少なかったですが、徐々に増やしていくと聞きました。
今がとりあえず3Dプリンター、レーザーカッター、筆記用具、電子工作の基本パーツ、そして大方CNCマシン(子供自分での使用禁止)などが置いてあります。

子供たちが自分で3DデザインをTinkerCADで作り、それを3Dプリンターで形にする。
熱加工機で自分のデザインをカバンに印刷する。
VIVITA独自の電子工作パーツでRC車をつくり、独自のソフトで制御プログラムを書く。
裁縫の得意な子は自分のぬいぐるみをつくる。
子供にとってはかなり楽しい場所です。
そして、大人スタッフもいますので、機械などの使い方も教えてくれるし、ちょっと危険そうな機械などは大人が操作してくれます。
子供も親も安心に過ごせる場所だと思います。
機会があれば、ぜひシンガポール(ちょっと遠い?)か柏の葉へ訪ねってください!😉

2019年8月15日木曜日

MRR ESPA:ESP32の3Dプリンター制御基板

ESP32の3Dプリンター制御基板MRR ESPAの開発が順調に進んでいます。


今までの過熱問題もトレースを太くしたことによって解決しました。
ファームウェアの開発もMarlinレポで進んいます。
Marlinファームウェアはこのボードの基本的動作を全て対応しています。
TMC2130のSPIモードも確認できました。

最近はテストプリントとして色々プリントアウトしています。
例えば、以下のもの。

ボードの冷却について、8010ファン(80mm x 80mm x 10mm)をお勧めします。
大きさと風量の割に静かです。

これから製造工場を探します。
早くこのボードを世の中に出したいです!
お楽しみに!😉

追記:レポでは英語のみですが、近日、日本語の説明や取説を作るつもりです。

2019年5月30日木曜日

ベーシックESP32-CAMスケッチ

ESP32カメラの続きです。
前回はOTAやmDNSなどを追加しました。
今回はとても基本的なスケッチです。
設定とかなにもありません。
全てはスケッチ内でハードコーディングされています。
https://github.com/vivian-ng/esp32_camera_streaming
スケッチではAI-ThinkerのESP32-CAMモジュールのピンアウトを使用しています。
別のカメラモジュールを使う場合、ピンの番号を変える必要があります。

ちなみに、ベースのスケッチはこれです:
https://github.com/maximemoreillon/esp32_camera_streaming

それにWiFi設定をメインのスケッチに移動、そしてmDNSを追加しただけです。

#define WIFI_SSID "ssid"
#define WIFI_PASSWORD "ssid_password"
WiFi設定はこの2行です。

#define HOSTNAME "esp32cam"
ホスト名はこの行です。
これがあれば、
http://esp32cam.local/
だけでカメラからのビデオが見れます。
ホスト名は任意に変えられます。
例えば、複数のモジュールを使っている場合、
esp32cam1
esp32cam2
などにすることもできます。

で、利点は?

まず、ウェブ上の設定ページをなくしたことによって、このESP32カメラモジュールは単純なネットワークカメラになり、MotionEyeなどで「Network camera」として使用できます。
mDNSを追加することによって、ホスト名で接続できます。
IPアドレスをしらべたりしなくても大丈夫です。
例えば、MotionEyeでカメラを追加と選択し、
Camera Typeを「Network camera」で、
カメラのURLを「http://esp32cam.local/」に入力。

また、PSRAMがあるモジュールの画像解析度についてですが、
1600x1200はできますが、(ベースのスケッチもそれになっています)
それだとESP32の処理能力がボトルネックになり、FPSが落ちます。
試した結果、やはりPSRAMがあっても800x600はベストです。

  if(psramFound()){
    Serial.println("PSRAM found");
    //config.frame_size = FRAMESIZE_UXGA;
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {

解析度を変えるには赤字のところを変えればいいです。
UXGAは1600x1200です。
SVGAは800x600です。
その他に、
QQVGA = 160x120
QQVGA2 = 128x160
QCIF = 176x144
HQVGA = 240x176
QVGA = 320x240
CIF = 400x296
VGA = 640x480
XGA = 1024x768
SXGA = 1280x1024
QXGA = 2048x1536 (メモリ的に無理かもしれません)
があります。

今度はこのスケッチにOTAを追加するかな?

2019年5月18日土曜日

ESP32の3Dプリンター制御基板:進捗2

色々があって、やっと火事にならないようにヒートベッドが使えるようになりました。

実は、「犯人」は中国のMOSFETです。
Aliexpressで購入したIRLS3034を何度も試しましたが、毎回炎上。
そして、Mouserから同じIRLS3034を購入し、全然問題なく加熱ができました。

左はAliexpressで購入したもの、右はMouserで購入したもの。
見た目も違います。

以前、モーターなども操作確認もしましたので、これからはテストプリントを試し、最終確認を行います。
問題は、時間。。。😟

2019年4月16日火曜日

ESP32カメラモジュール+HTTP+RTSP+OTA+mDNS

以前、AI-ThinkerのESP32カメラモジュールを少し紹介しました

GitHubであるスケッチを見つけ、それを改良しました。
元のスケッチはgeeksvilleさんのTenDollarWebcamです。
このスケッチを使えば、HTTPはもちろん、VLCなどでRTSPプロトコールでも動画が見れるようになります。
Wi-Fi接続はSmartConfigなので、携帯に専用のアプリを使えば、ESP32を家のWi-Fiルーターに接続できます。
私はこのアプリで設定できました。

私はこのスケッチに、OTA及びmDNSをつけました。
一回シリアルでフラッシュすれば、今度からはOTA(無線)でフラッシュできます。
そして、IPアドレスが分からなくても、
http://esp32cam.local/
でブラウザからカメラの動画が見れます。

そして、VLCなどRTSPプロトコールを使いたいとき、
rtsp://esp32cam.local:8554/mjpeg/1
で動画が見れます。

改良スケッチはこちら:https://github.com/vivian-ng/TenDollarWebcam

2019年3月29日金曜日

新しいM5StickC

M5Stack社から新しい商品が出ました。
先日、新商品M5StickCを応募して、昨日届きました。


まだ試していませんが、ちょっと紹介します。
ESP32マイクロコントローラーを搭載し、以下のセンサーや出力を持っています。
マイク
6軸センサー
LED
IR送信
IPS LCDスクリーン(解析度:80x160)
ボタンx2

購入はM5StackのAliexpressストアから。
のちにSwitch Scienceからも購入できるでしょう。

今度試したら、また記事を書きます!まずは使い方を考えないと。。。😅

2019年3月21日木曜日

ESP32の3Dプリンター制御基板:進捗1

現在、ESP32を使用して3Dプリンター制御基板を設計中です。
一応、動けるステージまでたどり着きました。
しかし、トレース幅が狭すぎて、大量電流が流れる時、PCBが焼けてしまい、煙が出てしまいます。
外付けMOSFETを使用するなら、全然使えますが、次のバージョンはトレース幅をより広くしたものにします。

モーターがちゃんと動いている動画:

ファムウェアはMarlinの改造版を使用する予定です。
この改造版はESP32のWIFI機能を利用してブラウザ上で制御できます。
実はMarlinとESP3Dの合体です。

4月中に何とか完成したいなと思いますが、最近は少し忙しく、この目標は少し難しいかもしれません。
ま、目標がないよりいいでしょう。

設計のGitHubリポジトリはここです

2019年1月13日日曜日

また新商品、ESP32のカメラモジュール

先日、ESP32の新カメラモジュールについて書きましたが、すぐにまた新商品が出ているとわかりました。

まずはEspressif社の正規商品。
まだ開発中で、発売されていません。
ESP-EYEと言います。
ESP-EYE ESP32 AI Development Board Supports Face detection, Voice wakeup

顔認識のために開発されているようです。
ESP32を使用し、8MBのPSRAM搭載。
マイクもあります。
最終的はESP-WHOというファームウェアで顔認識をするそうです。
USBポートはありますが、SPI関連ピン以外のピンがブレークアウトされていなく、他の用途に回すのが少し難しいかもしれません。

次は既に発売されているTTGO T-Cameraです。
TTGO T-Camera ESP32 Camera Board Comes with OLED Display, Sensors

これもピンがブレークアウトされていませんが、BME280環境センサー及びPIRセンサーがあります。
使用するESP32も最新のESP32-WROVER-B、8MBのPSRAMが内装されています。
さらに、0.96インチ128x64 OLEDもついています。
これもピンがブレークアウトされていませんが、USBとI2Cに接続するコネクターがあります。
電池コネクターと充電ICもあります。
TTGOからファームウェアも出ています。
購入はAliExpressから。値段はM5Cameraより少し高いです。
商品が届いたら、レビューします!

ちなみに、BME280やPIRセンサーが搭載されていないバージョンもあります。
TTGO T-Journalと呼びます。

ファームウェアはこちら
購入はLilyGOストアから。

なんか、最近、ESP32のカメラモジュールが大ブームだそうです。
今後の動きも楽しみにしています!

2019年1月5日土曜日

新しいESP32カメラモジュール

先日、M5StackのESP32カメラモジュールについて書きました
ファームウェア、ソースコードなどはこちらです。
https://github.com/m5stack/esp32-cam-demo

その後、M5Stack社はPSRAM付のモジュールを
M5Cameraという名前で発売開始しました。
ファームウェアも既にフラッシュされて、購入してそのまま使えます。

中身はESP32のWROVER(4MbのPSRAM内装)を使用しているみたいです。
写真通り、カメラモジュールがケースの中、そのケースもレゴと交換性があります。
これを使って、カメラ付きのレゴロボットを作ることも可能でしょう。
ファームウェアのソースなどはこちら:
https://github.com/m5stack/m5stack-cam-psram
Switch Scienceから購入できます。

そして、A.I.Thinker社も廉価カメラモジュールを発売開始しました。
値段はM5Cameraの約半額。
機能も同じ。
ただ、ケースがなく、USB接続もできません。
新しいファームウェアをフラッシュする時はUSB→Serialアダプターが必要です。
フラッシュする時は、3.3VとGNDをアダプターの3.3VとGNDに接続、モジュールのIO1(TX)をアダプターのRX、IO3(RX)をアダプターのTXに接続、そしてIO0とIO2をGNDに接続します。その後、RSTボタンを押します。
そうすると、ESP32はフラッシュモードに入ります。
ファームウェアはEspressifの公式なスケッチ:
https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Camera/CameraWebServer
自分のSSIDとパスワードに書替え、コンパイルしてフラッシュ。
フラッシュが終わったら、IO0をGNDから切断し、RSTボタンを押せばESP32は普通モードに入り再起動します。
起動したら、ターミナルからモジュールのIPアドレスを確認し、そこへ接続すれば設定メニューが出てきます。
画像の解像度を選択して、下の「Stream」を押せばビデオが流れます。
このモジュールはESP32のWROOMを使っていますが、PSRAMのICもあるため、実はM5Cameraと同じ性能です。
640x480のビデオは問題なくストリーミングできます。
1600x1200までもストリーミングできますが、少しラグがあります。
でも、全然使えます。
今のところ、国内ではまだ扱っていないため、購入はAliexpressから。
例えば、ここ

今度、CameraWebServerESP3Dを合体してみます。

追記:
USB→SerialアダプターはAMS1117などがあるものを使いましょう。
例えば、これ
そうでないと、電流が足りなく、ESP32はWiFiを起動できなく、ブラウンアウトします。

2018年12月27日木曜日

PCB注文、そして到着

ESP32に基づいた3Dプリンターコントロールボードを制作中です。

そして、先日(19日)にそのPCBをネットで注文しました。

なんと、昨日(26日)到着。
1週間。本当に速い!

一応、まだプロトタイプです。
意見があればこちらへどうぞ!

ちなみに、今はまだはんだ付けできません。
MOSFET待ちです。

2018年12月17日月曜日

ESP32の3Dプリンター制御基板

ESP32を使って3Dプリンターを制御

一応、デザインができました。
ここで共有しています。
初めて自分でPCBを設計しましたので、ぜひコメントをいただきたいです。
のちにPCBを注文し、部品をはんだ付けして動かしてみます。

設計の時、考慮したのが:
・100mm x 100mmで収めること(激安PCB制作サービスを使うため)
・ESP32のみ使用、拡張のためのICは使用しないこと
・24Vでも使えること
・ヒートベッド電流20Aを理論上できること(でも、実際に20Aを使うのがとても怖いです)
・別のユーザーの要望として、TMC2130やTMC2208というステッパーモータードライバも使用できること
・ピンが足りないため、普通のLCD2004やLCD12864が使えない代わり、AUX1コネクターを通じてMKS TFT32などが使用できること

シフトレジスタ(SN74HC595など)を使ってESP32のピンを増やすという動きもありますが、それはこのプロジェクトのパートツーに回します。
まずはベーシックのものを。

意見、コメント、指摘などがあれば、こちらかこのブログのコメント機能を使ってください。

2018年12月8日土曜日

ESP32を使って3Dプリンターを制御

最近の電子工作テーマ:
「ESP32を使用した3Dプリンター制御基板の設計・製作」

緑の基板は、Morpheusというオープンソース設計です。
もともとSTM32F103のBluePillという開発板のために設計したものですが、
ESP32の開発板につないで使用してみました。
そして、その設計に問題ないと確認し、
今度はちゃんとしたPCB基板を設計して、
SMD部品で3Dプリンター制御基板を作ります。

2018年11月28日水曜日

ESP32の3Dプリンターコントロールボード、設計中!

ESP32はとても人気のあるマイクロコントローラーです。
32ビットで、WiFi機能も内蔵されて、IoT開発にはとても便利です。
M5Stackのような商品で売られて、開発のスピードアップにも貢献しています。
私もちょっとESP32のファンです。

で、ESP32を使って3Dプリンターを制御できるのか、ずっと思いました。
このようなコントロールボードは市場に出ていませんが、
GitHubを探したら、実はプロトタイプがあります。
simon-joetさんのESP32Controllerです。
そして、ファームウェアとして、
luc-githubさんのMarlinのブランチ(eps32-webui)があります。
それはMarlinESP3Dを合体したものです。
ウェブブラウザからESP32に指示を出し、3Dプリンターを制御します。

この二人の設計やコードに基づいて、私は今自分で基盤を設計しています。
成功したら、ここで報告します!

2018年11月10日土曜日

横浜ガジェットまつりに行きました

今日、横浜ガジェットまつりに行きました。
富士ゼロックスR&Dスクエアの会場を回りましたが、ちょっと規模が小さすぎて、すぐ帰りました。


ま、一応、みんな何を作っているのか、見るのができて、少しは勉強になりました。

2018年11月9日金曜日

メーカーから直接注文してみました

自作3Dプリンターコントロールボードを作ろうとしています。
そのため、あるDC降圧ICが必要です。
いつもアマゾン、AliExpressとeBayで部品を調達していますが、見つからないため、今回はメーカーから直接注文してみました。
すると、驚きました。
火曜日に発注した部品が、木曜日の午後に届きました。
しかも海外発送、送料無料。
これからはこのメーカーの部品が必要な時、直接メーカーから注文します。

2018年9月27日木曜日

割り込みでSTM32F103をスリープから起こす

前回、「STM32F103C8T6をスリープ状態にする」について書きました。

今回、一定の時間から起きる状態に加えて、外部割込みからも起きるようにしたくて、色々試しました。
やはりstm32sleepライブラリーはうまくできず、前回のtomtorさんのコードをもとにテストプログラムをつくりました。
外部割込みを使うため、attachInterruptという関数を使います。
attachInterrupt(BOARD_BUTTON_PIN, action, CHANGE);
BOARD_BUTTON_PINにスイッチをつけ、そのスイッチに変化があれば割込みが発生します。
そして、起きたら、何を実行するかは新たにactionという関数を設けました。
tomtorさんのAlarmFunctionという関数は、スリープから起きた際、クロックを再設定する操作があります。そのままactionの中に使います。
void action()
{
  AlarmFunction ();
  if (state == LOW) state = HIGH;
  else state = LOW;
}
ここはただLEDの点灯状態を反対にするだけ。

全部のコードは以下の通りです。

#include <RTClock.h>
#include <libmaple/pwr.h>
#include <libmaple/scb.h>

#define LED  PC13
#define BOARD_BUTTON_PIN PB0

// Define the Base address of the RTC registers (battery backed up CMOS Ram), so we can use them for config of touch screen or whatever.
// See http://stm32duino.com/viewtopic.php?f=15&t=132&hilit=rtc&start=40 for a more details about the RTC NVRam
// 10x 16 bit registers are available on the STM32F103CXXX more on the higher density device.
#define BKP_REG_BASE   ((uint32_t *)(0x40006C00 + 0x04))

// Setup RTClock for sleep
RTClock rt(RTCSEL_LSI, 39); // 1 milli second alarm
long int alarmDelay = 10;

void storeBR(int i, uint32_t v) {
  BKP_REG_BASE[2*i]= (v << 16);
  BKP_REG_BASE[2*i+1]= (v & 0xFFFF);
}

uint32_t readBR(int i) {
  return ((BKP_REG_BASE[2*i] & 0xFFFF) >> 16) | (BKP_REG_BASE[2*i+1] & 0xFFFF);
}

void sleepMode(bool deepSleepFlag) { 
  // Clear PDDS and LPDS bits
  PWR_BASE->CR &= PWR_CR_LPDS | PWR_CR_PDDS | PWR_CR_CWUF;

  // Set PDDS and LPDS bits for standby mode, and set Clear WUF flag (required per datasheet):
  PWR_BASE->CR |= PWR_CR_CWUF;
  // Enable wakeup pin bit.
  PWR_BASE->CR |=  PWR_CSR_EWUP;
  
  SCB_BASE->SCR |= SCB_SCR_SLEEPDEEP;

  // System Control Register Bits. See...
  // http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/Cihhjgdh.html
  if (deepSleepFlag) {
    // Set Power down deepsleep bit.
    PWR_BASE->CR |= PWR_CR_PDDS;
    // Unset Low-power deepsleep.
    PWR_BASE->CR &= ~PWR_CR_LPDS;
  } else {
    adc_disable(ADC1);
    adc_disable(ADC2);
#if STM32_HAVE_DAC
    dac_disable_channel(DAC, 1);
    dac_disable_channel(DAC, 2);
#endif
    //  Unset Power down deepsleep bit.
    PWR_BASE->CR &= ~PWR_CR_PDDS;
    // set Low-power deepsleep.
    PWR_BASE->CR |= PWR_CR_LPDS;
  }

  // Now go into stop mode, wake up on interrupt
  asm("    wfi");

  // Clear SLEEPDEEP bit so we can use SLEEP mode
  SCB_BASE->SCR &= ~SCB_SCR_SLEEPDEEP;
}

uint32 sleepTime;

void AlarmFunction () {
  // We always wake up with the 8Mhz HSI clock!
  // So adjust the clock if needed...

#if F_CPU == 8000000UL
  // nothing to do, using about 12 mA
#elif F_CPU == 16000000UL
  rcc_clk_init(RCC_CLKSRC_HSI, RCC_PLLSRC_HSE , RCC_PLLMUL_2);
#elif F_CPU == 48000000UL
  rcc_clk_init(RCC_CLKSRC_HSI, RCC_PLLSRC_HSE , RCC_PLLMUL_6);
#elif F_CPU == 72000000UL
  rcc_clk_init(RCC_CLKSRC_HSI, RCC_PLLSRC_HSE , RCC_PLLMUL_9);   // 72MHz  => 48 mA  -- datasheet value           => between 40 and 41mA
#else
#error "Unknown F_CPU!?"
#endif
  
  extern volatile uint32 systick_uptime_millis;
  systick_uptime_millis+= sleepTime;
}

void mdelay(int n, bool mode= false) {
  sleepTime= n;
  time_t nextAlarm = (rt.getTime() + n); // Calculate from time now.
  rt.createAlarm(&AlarmFunction, nextAlarm);
  sleepMode(mode);
}


#define   RCC_CFGR_HPRE_DIV1   0x00000000U
#define   RCC_CFGR_HPRE_DIV2   0x00000080U
#define   RCC_CFGR_HPRE_DIV4   0x00000090U
#define   RCC_CFGR_HPRE_DIV8   0x000000A0U
#define   RCC_CFGR_HPRE_DIV16   0x000000B0U
#define   RCC_CFGR_HPRE_DIV64   0x000000C0U
#define   RCC_CFGR_HPRE_DIV128   0x000000D0U
#define   RCC_CFGR_HPRE_DIV256   0x000000E0U
#define   RCC_CFGR_HPRE_DIV512   0x000000F0U


void msleep(uint32_t ms) {
  uint32_t start= rt.getTime();
  
  while (rt.getTime() - start < ms) {
    asm("    wfi");
  }
}

int state = LOW;

void setup() {
  pinMode(LED,OUTPUT);
  pinMode(BOARD_BUTTON_PIN, INPUT_PULLUP);
}

void loop() { 
  digitalWrite(LED,state);
  delay(60);  
  attachInterrupt(BOARD_BUTTON_PIN, action, CHANGE);
  mdelay(alarmDelay * 1000);
}  

void action()
{
  AlarmFunction ();
  if (state == LOW) state = HIGH;
  else state = LOW;
}