ひとしれずひっそり

主にソフトに関することをメモしていきます。過程をそのまま書いていたりするので間違いが含まれます。鵜呑みしない様に。

LoRaモジュール評価ボードテスト(2)

GPS追加

GPSセンサーを追加し移動しながらどこまで届くか試す。

使ったGPSセンサーはこちら

akizukidenshi.com

受信したらGoogle spreadsheetにhttp postで送信する。

Google spreadsheetへpostするのは探せば色々あるがairpocketさんのが参考になるだろう。

elchika.com

送信側:

LoRaモジュール評価ボード E220-900T22S(JP)-EV1を使ったLoRa通信送信側 M5AtomS3使用 · GitHub

受信側:

LoRaモジュール評価ボード E220-900T22S(JP)-EV1を使ったLoRa通信受信側 M5AtomS3使用 · GitHub

結果

受信機を屋内に置いて、車で移動しながら送信すると、400m圏内では安定して受信できることが確認できた。
最長は1.7Kmから受信できていた。(でも間は取りこぼしていた)

住宅が多い方から来た時の結果で、見晴らしが良い方や止まれば距離が延びるのかは今後試す。

試してみた。
見晴らしがいい方で1.5kmまではいけそう。
最長は2.0Kmだが止まっていても受信せず、運が良くてたまたま受信しただけの様。

Gesture: System gesture gate timed out.

DragGestureを使っていてDragせずに長い間押しているとtimed outが表示される。
何も影響はない様だが煩わしい。

DragGestureはボタンを押した時と離した時のイベントを取りたいので使っていて、Dragするる必要はない。
1 pixel でも動かせば出ない様だが、押してるだけで移動させていないので頻繁に出ている。

使っているコードはこんな感じ

                .gesture(DragGesture(minimumDistance: editable ? 0 : CGFloat.greatestFiniteMagnitude)
                    .onChanged { value in
                        if pushing == false {
                            pushing = true
                        }
                    }
                    .onEnded{ value in
                        pushing = false
                    }
                         , including: .all
                )

検索しててこちらが見つかった。

www.hackingwithswift.com

この問題の解決というわけではなく、システムのジェスチャーに優先してアプリのジェスチャーを優先させたい時に使用するということで、単なるメモだ。

システムのジェスチャーに優先してアプリのジェスチャーを優先させたいというのは、例えば上下付近のスイフト

Garage Bandの鍵盤で使われてると思われる。 下からドラックするバーがグレーになっていて、一度スイフトすると黒になり、その状態でスイフトするとアプリスイッチャーが表示される。
ただ、Garage Bandは2回スイフトしてしまうことがあるので、それでもあっあっあっあっあ〜ってなってしまうことがある。


戻って、メッセージの意味合いから、System gestureは諦めたのでアプリのジェスチャーに譲るよってことかな。

LoRaモジュール評価ボードテスト(1)

秋月電子からLoRaモジュール評価ボードを購入した。

akizukidenshi.com

シリアルで通信するのだが、ボーレートは9600がデフォルトというのは分かっているが、他の条件が分からない。

こちらにあるコンフィグモード(mode 3)の条件baudrate=9600, parity=8N1に合わせてみる。
というかSerialのデフォルトがこれになっているはず。

support.dragon-torch.tech

バイスはM5AtomSから送信してM5Stamp picoで受信する。

1発では動かないよね。
LoRaモジュールを外してM5AtomS、M5Stamp pico間でワイヤー接続してみるとちゃんと通信できている。

LoRaモジュールの使い方に問題がありそう。
と思ったのだが、電圧を測っていったらM5Stamp picoの5V端子が2.8Vくらいしかない。
M5Stamp picoは外部電源が必要だったか。 外部電源を用意してもいいが面倒なのでM5AtomLiteに変更する。

こんどは通信できた。

送信側

gist.github.com

受信側

gist.github.com

Xcodeでビルドが進まなくなった

Xcodeコンパイルしているとある時点で進まなくなってしまった。

ネットで探して試してみるも改善せず。

思い出してみるとXcode cloudのボタンが出てて、押して使ってみるかと思ったけけど、アプリ名などまだ迷ってて登録してないので、後にしようと思って中断した。

どうもこの時に何か作られてXcode cloudとやりとりしていて進まなくなった様な気がする。

もう一度 Xcode cloudのボタンを押してキャンセルした。
その後はボタンが消えてビルドでが終了する様になった。

追記:

また発生したので、Xcode cloudは関係ないかもしれない。
ご飯時だったのでそのまま放置してたらエラーが出ていた。

The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions

最近わかってきたが、型を指定せず自動判別させているとこのエラーが出やすい気がする。
特にIntとCGFloatが混在する様な場合だ。 本人はCGFloatのつもりでも1と整数で書いたりするが型推論に影響を与えている様なので気をつけた方がいい。

どこが悪いかはエラーが出るまで分からないのでこうなったら見当づけて大きいブロックをコメントにして、原因をつきとめるまでやるしかないかもしれない。

M5でmruby/c (5)

クラスは作れたんだけどメソッド呼び出しがうまくいかない。

https://github.com/mrubyc/mrubyc/blob/master/src/class.c#L131-L155

メソッドの定義はこちらで処理されている。

void mrbc_define_method(struct VM *vm, mrbc_class *cls, const char *name, mrbc_func_t cfunc)

前回最初の引数を0にしていたがVMへのポインターを渡す様だ。
関数ポインターmrbc_func_t という型になる。

typedef void (*mrbc_func_t)(struct VM *vm, struct RObject *v, int argc);

https://github.com/mrubyc/mrubyc/blob/master/src/value.h#L62

るびまの記事を参考にする。

https://github.com/kishima/libmrubycForWioLTEArduino/blob/master/src/hal/ext_wio.cpp#L15-L30

static void class_wio_control_led(mrb_vm *vm, mrb_value *v, int argc )
{
    if(argc!=3){
        SET_FALSE_RETURN();
        return;
    }
    if(wio==NULL){
        DEBUG_PRINT("wio==NULL\n");
        return;
    }
    int r=GET_INT_ARG(1);
    int g=GET_INT_ARG(2);
    int b=GET_INT_ARG(3);
    wio->LedSetRGB(r, g, b);
    SET_TRUE_RETURN();
}
  • 引数の数をチェック
  • 操作するデバイスが存在するか確認
  • GET_INT_ARG()で引数から値を取得している
  • SET_TRUE_RETURN()で戻り値をセット

という感じだろうか。

それに倣ってこうしてみる.

static void
class_display_set_text_size(mrb_vm *vm, mrb_value *v, int argc)
{
  mrb_int i;
    if(argc!=1){
        SET_FALSE_RETURN();
        return;
    }
    i = GET_INT_ARG(1);
  M5.Lcd.setTextSize((uint8_t)i);
    SET_TRUE_RETURN();
}

rubyコードは

Display.set_text_size(3)

実行してみると

Exception(vm_id=1): undefined local variable or method '3' for Display (NoMethodError)

引数の3が認識されていないみたいだ。

そもそもmrbcでコンパイルする時にDisplayがクラスだとどうやって認識するんだ。

3軸トゥールビヨンの置き時計【3Dプリント用STLデータ】購入した(9)

17:38まで進んだ。

本体ケースネジのメクラが直ぐ外れるので完成したら接着しよう。
文字盤の目盛りが一つ無くなってたので後で印刷する。
文字盤が動くところまでできた。

youtu.be

M5でmruby/c (4)

いつもmrubyとかmruby/c動いたで終わってしまうのでもうちょっと突っ込んでみる。
Peripheralをmrubyで動かしてこそmrubyを使った感があると思う。

  • M5StackのLCD用に mruby-lcd-m5stack がある。
    github.com
  • mrubyだと build_config.rb で組込む様だがPlatformIOでやっている分には build_config.rb が見当たらない。
  • platformio.iniのlib_depsに追加してみるか。
  • M5Stack.hをインクルードしているので、試しにM5Unifiedを入れてみる。
  • mruby.hもインクルードしている。
    • mruby/cはmrubyc.hになるから mruby-lcd-m5stack はmruby用かとここで気付く

振り出しに戻る

るびまに記事があった。

magazine.rubyist.net

仕様としてはLcdのフォントサイズを指定し、printで表示させることを目指す。
クラスとしてDisplayでクラスメソッドとしていset_text_sizeとprintを使用する。

  • Display.set_text_size
  • Display.print

様々な機種に対応できる様にM5Unifiedを使用する。

platformio.ini

lib_deps =
  https://github.com/mrubyc/mrubyc
  M5Unified

クラス定義用としてdefine_classes.[h|cpp]を作成。

define_classes.h

void define_display_class();

define_classes.cpp

#include <M5Unified.h>
#include <mrubyc.h>
#include "define_classes.h"

static void
class_display_set_text_size(mrb_vm *vm, mrb_value *v, int argc)
{
}

static void
class_display_print(mrb_vm *vm, mrb_value *v, int argc)
{
}

void define_display_class()
{
    mrb_class *class_display;
    class_display = mrbc_define_class(0, "Display", mrbc_class_object);
    mrbc_define_method(0, class_display, "set_text_size", class_display_set_text_size);
    mrbc_define_method(0, class_display, "print", class_display_print);
}
  • mrbc_define_classでクラス定義をする。
    • 最初は0でいいということなのでこのままですすめる。
    • 次はクラス名
    • 次は親クラスを指定ということだが今はこのままで進める。
  • mrbc_define_methodでメソッドを定義する。
    • 上と同様に0のままで。
    • 次はクラスのポインターでmrbc_define_class の戻りを与える。
    • 次がメソッド名
    • 次がメソッドのポインター

メソッドはまだうまくいっていないのでここでは中身は空で表現した。

main.c から呼び出す。

int main(void) {
.
.

  mrbc_init(memory_pool, MRBC_MEMORY_SIZE);

  define_display_class();
.
.

ここで暫くハマってしまった。
define_display_classが見つからないとエラーがでてしまう。

mrubycはC言語のみだったが、M5UnifiedはC++も使っている。

  • main.cファイルはmain.cppにしなければならない。
  • C++では外部ファイルからC関数を使用するにはextern "C" {}で囲まないといけない。

define_classes.h

extern "C" {
void define_display_class();
}

main.cpp

extern "C" {
void app_main() {
  main();
}
}

これでコンパイルが通る様になった。

まだ中身はないので次で動くといいな。