レフィクシア技術ブログ

レフィクシア社員が様々な技術を紹介します。

LRTKアップデート情報 アプリv.1.1.13 ファームウェアv.1.2.12

LRTKアプリ、LRTKのアップデート情報です。

LRTKアプリはv1.1.13

LRTKのファームウェアはv1.2.12

が2022/7/7に公開されました。アップデート内容は以下の通りです。

 

●LRTKアプリ

・L-Linkの操作手順を50%削減し、使いやすくなった

・L-Linkでの無線チャンネル設定が可能に

・内蔵GNSSレシーバ(F9P)の設定を一気に行える機能を実装(設定txt送信)

・FWアップデート時に利用するSSIDを検索から選べるように

 

●LRTK Proファームウェア

・L-Linkペアリング時に基準局・移動局間が離れていてもOK(電波が届く範囲ならOK)

・その他軽微なバグ修正

 

以上となります。

LRTKアップデート情報 アプリv.1.1.10 ファームウェアv.1.2.6

LRTKアプリ、LRTKのアップデート情報です。

LRTKアプリはv1.1.10

LRTKのファームウェアはv1.2.6

が公開されました。アップデート内容は以下の通りです。

 

●LRTKアプリ

・L-Linkで基準局設置時に使用した座標情報を保存し、次回も利用できるようになった

・UIの軽微な修正

・F9P設定ができなくなっていたバグを修正

・平面直角座標系利用時の表示バグを修正

・LRTK選択画面にて、同じLRTKが複数表示されてしまうバグを修正

 

●LRTK Proファームウェア

・F9Pのボーレート自動判別機能の実装(38400,115200,230400,460800,921600のみ対応※2022/7/13現在)

・L-Linkにてsuevry-in利用時に座標が確定しないバグを修正

 

以上となります。

L-Link(ローカル基地局RTK)設定方法

LRTKアプリの使い方説明です。

LRTKはNtripクライアントアプリを用いてRTCM補正信号をスマホからLRTKに渡すことにより、センチメートル級測位ができるGNSS端末です。 RTCM補正信号は近くの公共基準局などからインターネット経由で取得していますので、インターネットが圏外の場所ではRTKできないことになります。

そんな時、LRTK pro(以下、LRTK)に搭載されている「L-Link」を用いれば、インターネット環境がない場所でもRTKを実現できます。 L-Linkでは、1台のLRTKを基準局、もう1台を移動局に設定し、基準局から移動局へ直接RTCM補正信号を送信することでRTKを実現しています。

この記事では、ローカル基準局RTK「L-Link」の利用手順をご説明します。

※本記事の設定を行うには、LRTK2台、「LRTK App」インストール済みのAndroid端末が必要です。

用意するもの

Step1 基準局を設定する

  1. 基準局にしたいLRTKの電源を入れる(電源ボタン2秒長押しで起動音が鳴ります)
  2. スマートフォンと基準局にするLRTKをBluetooth接続する
  3. 「LRTK アプリ」を開き、左上のメニューから「LRTK設定」を開く
  4. 「L-Link」の項目を開く
  5. L-Linkにて、「設定する※1」を選択し、緯度経度/平面直角座標系を選択する
  6. 基準局を設置する座標を入力する
    7.「端末に送信する」を押すと、LRTK基準局に送信される(基準局に座標を設定すると、基準局のRTKランプが青に点滅します。)
    ※「設定する」は、F9PでのFixed modeのことです。「測量する」の自己測量(survey-in)も利用できますが、24時間以上その場で放置する必要があります。
    放置しても地域によっては収束結果が悪い可能性もあるので、「設定する」の利用をおすすめしています。

    基準局の座標が分からない場合

    通常、基準局を設置する場所は、国土地理院によって測量された3級基準点や、そこから現場までトータルステーションで測量した基準点の座標を入力します。 ただ、現場によっては基準点があっても絶対座標が分からない場合があります。 その場合は、LRTKを基準局設置予定箇所に20分ほど放置し、RAWデータを保存し、後で後処理解析によってFiX解を得る方法もあります。 この記事では説明しきれないので、「RTK LIB 後処理解析」などでお調べいただくか、弊社までお問合せください。

Step2 移動局をペアリングモードにする

  1. 移動局にしたいLRTKの電源を入れる
  2. スマートフォンと移動局にするLRTKをBluetooth接続する
  3. 「基準局」を選択し、「ペアリング」を押す。

※移動局を基準局に近づけてください。一瞬でペアリングして完了音♪が鳴りますが、場合によってはすぐにペアリングが成功しないことがあります。 移動局から1秒おきに音が鳴りますので、基準局との位置関係を調整する、別の場所に移動するなどしてみてください。30秒経過すると移動局のペアリングモードが終了し、ブブー♪と音が鳴ります。 ブブー♪と鳴ってペアリングに失敗してしまった場合は、基準局、移動局どちらも電源を切り、Step1からやりなおしてみてください。

Step3 移動局の情報を確認

空がよく見える場所ならば基準局からRTCMを送信していますので、移動局に接続してRTCM受信率をチェックしてみてください。 80%以上受信できていれば、移動局画面ではRover Fixという表示になっているはずです。

●利用方法に関するお問い合わせはこちら
receive@lefixea.com

●LRTKの製品情報についてはこちらから www.lefixea.com

コミュニケーションロボットの構想~その2

あけましておめでとうございます(2週間遅れですが…)  
今年も技術情報を皆さんに発信していきます!

 

前回はコミュニケーションロボットの構想ということで簡単な機構のモデルを紹介しましたが、今回は少し組み込み系の内容になります.

コミュニケーションロボットにとって目という部位は重要なファクターとなります  
喜怒哀楽の感情表現ができると愛着が湧きそうです  
というわけで、目の実装をしてみたいと思います。  

必要なもの

用意するのは以下の物品  
①1.28インチ 丸形液晶ディスプレイモジュール 240×240  
マイコン(今回はESP32-WROVER-E)  
③ジャンプワイヤー8本  

f:id:Lefixea:20220118204039j:plain

f:id:Lefixea:20220118204046j:plain

1.28インチ 液晶モジュール

この液晶モジュールはスイッチサイエンスなどでも購入できます  

www.switch-science.com

この液晶はGC9A01というドライバーが積まれており、SPI通信で制御することができます.  


マイコンはスペックが高いものがより高速に描画できたり、表示できる領域が増えます.  
STM32やRaspberry Pi Picoなどでも良いかもしれません。

 

接続方法  

ESP32の場合は以下のように接続してください  

ESP32 液晶モジュール
3V3 VCC
14 SC
18 CLK
23 DIN
27 DC
32 BL
33 RST
GND GND

f:id:Lefixea:20220118204032j:plain

接続(きたない…)

STM32やPicoなどの他のマイコンを使う場合はSPI通信を行うピンを使用してください.

 

プログラム

Arduinoで書いていきます.

描画系のライブラリはいくつかありますが、今回はLovyanGFXを使用させて頂きました.

github.com

git cloneしてライブラリフォルダに配置するか、zipでダウンロードしてArduino IDEの[スケッチ] > [ライブラリのインクルード] > [.ZIP形式のライブラリをインストール]で読み込みます.

 

基本的な使い方はreadmeに書かれています.

今回はロボットっぽくSF感のある目を描画してみようと思います.

ソースコード

#include "LGFX_ESP32_sample.hpp" // またはユーザ自身が用意したLGFXクラスを準備します


static LGFX lcd;                 // LGFXのインスタンスを作成。
static LGFX_Sprite sprite(&lcd); // スプライトを使う場合はLGFX_Spriteのインスタンスを作成。

int cx;
int cy;
int x_max = 240;            // x軸移動最大値
int x_min = 0;              // x軸移動最小値
int y_max = 240;            // y軸移動最大値
int y_min = 0;              // y軸移動最小値
int over_y = 0;             // まぶたのy軸移動量

static int radius = 50;
static int r1 = 105;         // 円弧1内側半径
static int r2 = 110;         // 円弧1外側半径
static int dang = 60;       // 円弧の長さ
static int bet_ang = 30;    // 円弧同士の幅
static int speed = 2;       // 回転速度
static int over_speed = 1; 

int angle_count = 0;


static int back_color[3] = {255, 255, 255};
static int blue_eye[3] = {255, 0, 0};
static int red_eye[3];
static int green_eye[3];

// 1週分の円弧をつなげて表示
void drawArc(int x, int y, int r1, int r2, int angle1) {
  sprite.fillArc(x, y, r1, r2, angle1, angle1+dang, lcd.color332(blue_eye[0], blue_eye[1], blue_eye[2]));
  int angle2 = angle1+dang+bet_ang;
  sprite.fillArc(x, y, r1, r2, angle2, angle2+dang, lcd.color332(blue_eye[0], blue_eye[1], blue_eye[2]));
  int angle3 = angle2+dang+bet_ang;
  sprite.fillArc(x, y, r1, r2, angle3, angle3+dang, lcd.color332(blue_eye[0], blue_eye[1], blue_eye[2]));
  int angle4 = angle3+dang+bet_ang;
  sprite.fillArc(x, y, r1, r2, angle4, angle4+dang, lcd.color332(blue_eye[0], blue_eye[1], blue_eye[2])); 
}

// 中央に目を配置
void drawCenterEye(int x, int y, int rx, int ry) {
  sprite.fillEllipse(x, y, rx, ry, lcd.color332(blue_eye[0], blue_eye[1], blue_eye[2]));
}

// 上まぶたを配置
void drawOverEye(int x, int y, int width, int height) {
  sprite.fillRect(x, y, width, height, lcd.color332(back_color[0], back_color[1], back_color[2]));
}

void setup(void)
{
  lcd.init();                    // 最初に初期化関数を呼び出します。
  lcd.setRotation(2);            // 回転方向を 0~3 の4方向から設定します。(4~7を使用すると上下反転になります。)
  lcd.setBrightness(128);         // バックライトの輝度を 0~255 の範囲で設定します。
  lcd.setColorDepth(8);         // RGB888の24ビットに設定(表示される色数はパネル性能によりRGB666の18ビットになります)

  cx = x_max/2;
  cy = y_max/2;

}

void loop(void)
{
    // 円弧の回転処理
    if(angle_count >= 360) {
        angle_count = 0;
    }
    angle_count += speed;

    // まぶたの移動処理
    if(over_y >= 50) {
      over_speed = -over_speed;
    } if(over_y < 0) {
      over_speed = -over_speed;
    }
    over_y += over_speed;

    sprite.createSprite(240, 240);
    sprite.setColorDepth(8);
    sprite.fillScreen(lcd.color332(back_color[0], back_color[1], back_color[2]));
    sprite.setPivot(cx, cy);
    drawCenterEye(cx, cy, radius/2, radius);
    drawOverEye(0, 170-over_y, 240, 70);
    drawArc(cx, cy, r1, r2, angle_count);
    sprite.pushSprite(0, 0);


    delayMicroseconds(10);

}

このコードを実行すると以下のようなものが出来上がります

f:id:Lefixea:20220118204952g:plain

アニメーションしている様子

 

このような感じで液晶モジュールにアニメーションを描画することができます.

これで感情を表現できるロボットの目を作っていきます.

 

それではまた。

コミュニケーションロボットの構想~その1~

ロボット開発の進捗報告です。

前回の記事でチラ見せした画像はロボットの首の機構のデモ機です。

サーボモーターに直接負荷がかかると故障の原因にもなりそうなので、ユニバーサルジョイントを作ってその上に頭部を配置しようと考えました。

下の図のようにロールヨーピッチの方向に回ります。

f:id:Lefixea:20211220092347p:plain

ユニバーサルジョイント

顔を設置してみるとこんな感じです。(載せているだけで結合していないです)

f:id:Lefixea:20211220093046p:plain

顔を設置

ロールとピッチを後ろのリンク越しのサーボで動かし、ヨー軸は頭部にサーボを載せてギアで回転させようかと思います。

このシリーズは筐体の設計だけではなく要素開発の部分も公開していく予定です。

(システムの部分やシリアルサーボの動かし方など)

次は目となる液晶部分の解説をしていきます。

久々のブログ更新です。

こんにちは。

9月以来のブログ更新です。3か月も音沙汰なしでしたが別に中の人が会社を辞めたとかそういうことはございません。事業内容が充実してきて時間が取れてなかっただけす。

今回は今後のLゼミ内容の告知をしようと思います。

現在コミュニケーションロボットの設計をしておりまして、その進捗報告や作るのに必要な技術を解説していこうと思います。

 

とりあえず週1くらいで内容をお届けできればと。

是非Twitterなどで記事が更新されたときなどに目を通していただけますと幸いです。

それではまた。

f:id:Lefixea:20211211152325p:plain

ロボットの一部



 

第02回 モータードライバを作ってみた  (その2)

こんにちは、アンディです。

 

社内ゼミ自体は週1で行っているのですが、2回目は注文していた部品が届かなかったので進捗がありませんでした。

今回は無事に部品が調達できたのでモータードライバ製作の続きをやっていきます。

第01回はこちらから

lefixea.hatenablog.com 

調達物品は以下の通りです。

  • ハーフブリッジドライバ:IR2302
  • セラミックコンデンサ:0.1μF ~ 10μF くらい
  • 各ご家庭にあるマイコン

 

前回は製作したモータードライバのMOSFETのゲートの先に直接電圧を加えて駆動させていました。しかしそれだと流石に駆動がアナログ過ぎるので、マイコンで動作させようと思います。

 

参考資料(つくろうモータードライバ)によるとMOSFETのゲートに印加する電圧は10V以上が良いらしいです。しかし一般的なマイコンでは10V以上の電圧の出力は難しいですね。そこで電圧を昇圧する方法で推奨されているブートストラップ回路を用います。

ブートストラップ回路はハイサイドとローサイドの中心の電位を基準にしてコンデンサ電荷を貯め、その電荷ハイサイドMOSFETを駆動します。この回路をハーフブリッジドライバICを使って作った回路が図1と2になります。

f:id:Lefixea:20210904113718p:plain

図1 ハイサイドOFF、ローサイドONの時の充電回路

f:id:Lefixea:20210904114453p:plain

図2 ハイサイドON、ローサイドOFFの時の回路

まずICが駆動したときローサイドFETがONになると、ゲート電源がオレンジの矢印の経路で流れてコンデンサ電荷が貯まります。次にローサイドがOFFになると充電されたコンデンサの電圧がハイサイドFETのゲートに印加されます。このときモータに電流が流れて駆動します。

 

さっそく回路を組んでいきます。

今回調達したドライバIR2302はハーフブリッジ用なので、前回製作した回路を動かすには2つ必要です。あとはICの仕様書を読んで回路に繋げて、自分の宗派のマイコンを繋げれば完成です。今回はESP32を使用します。

 

プログラムを組んで動かしますが処理工程は簡単です。回転したい場合は片方のICにPWM信号を大きくインプットし、もう片方のICは0をインプットします。すると次の動画のようになります。

f:id:Lefixea:20210903164234g:plain

なんかおかしい…

 

?? モーターの挙動がおかしいですね…

 

原因はコンデンサにありました。入力したPWM値ではコンデンサの容量が放電しきってしまって電圧が足りなくなるからでした。

この場合はコンデンサの容量を上げるかPWM値を下げて充電する期間を多くすることで回避できるとのこと。

 

ということでPWM値を下げて駆動してみます。

f:id:Lefixea:20210903165450g:plain

きれいに回りました。ついでに逆回転もしてみました

きれいに回転しました。このPWM値はコンデンサの容量などから計算することもできます。面倒な方はとりあえず下げれば動きます...

 

やっとモータードライバっぽくなってきました。今はまだブレッドボード上に回路があるので、次回はCNCルータで自前で基板を作っていこうと思います。

それでは。

 

参考資料

booth.pm