2019年7月15日月曜日

テスト用DBを一発で初期化するbash

自分の忘備録

開発しているときは、テスト用DBを繰返し初期化する。
そのシェル。でも、僕以外にはほとんど利用価値はないかも、、、
ポイントは、DBにインポートするデータを集めたdirectoryを指定し
その中から、ファイル名だけを抽出してDB登録するシェルに渡す処理かも

自分用だから、説明はなし。

Peace!!

#!/bin/bash

# テスト用データのディレクトリー
files="../../data/*"
fileary=()
dirary=()

DB=DB名称
USER=ユーザ名
PW=パスワード

# DBのデータを削除して初期化する
mysql -u$USER $DB -p$PW << EOS
truncate hd;
truncate seibans;
update counters set value=0 where name='seibans';
EOS


for filepath in $files; do
    if [ -f $filepath ] ; then
        fileary+=("$filepath")
    elif [ -d $filepath ] ; then
        dirary+=("$filepath")
    fi
done

#echo "ファイル一覧"
for i in ${fileary[@]}; do
    qq=$i
    # pathを削除
    qqq="${qq##*/}"
    # ファイル名の拡張子を取る
    FILE=${qqq%.*}
    # テストデータDB登録
    ./reg.sh $FILE
done

#echo "ディレクトリ一覧"
#for i in ${dirary[@]}; do
#    echo $i
#done

2019年7月13日土曜日

Android studio 小ネタ

Android studio の備忘録、特に小ネタ
メモ代わりに追加していきます。

(1)既存のProject/Packageを利用して新しいPackageのProjectを作る


(2)既存のProjectを、OneDriveにコピーして利用する

Android Studioで開いて、build > Clean Project
そのまますると、スマフォへのインストール時に、古いWindows Pathを使おうとする。
そのエラーでインストールできなかったけど、このを実行したあとはインストールできた。コンソールに出るメッセージでも変わった事は確認できた。
これで、OneDriveを介して複数のPC間でプロジェクトを共有可能となった。
便利便利 (^^)/

Peace!!


2019年7月12日金曜日

Firebase ML KitのSample Package名を、新たなPackage名に変更する

あくまでも、忘備録

何を言っているかというと、、、まぁ、うまく伝えられないので、、、
簡単にいうと自分のPackage名(com.futureagri. )にしたい。
com.google.firebase.samples.apps.mlkit というながーいPackage名
それに、google さんのsamplesと入るのは、嫌だなぁ

Firebaseのプロジェクトもっており、アプリの登録もできるている事



ベタベタだけど、、、

(1) Package 名を決める
com.futureagri.app.xxx.hd
その名前で、Firebaseにアプリの登録を済ませる。

(2)ソースコードの修正
quickstart-android\mlkit\app\src\main\java\com\google\firebase\samples\apps\mlkit
のmlkitをコピーする。
この中にあるソースコードのPackage名を変更する。

com.google.firebase.samples.apps.mlkit を
com.futureagri.app.xxx.hd  に変更する。

(3) Android Studioで新規プロジェクトを作る
Start a new Android Studio project  を選び
Activityは、Add No Activity
次の画面にPackageの情報を入れれば取り合えず終わり。
Package名で指定したディレクトリーができている。

(4) 編集したソースコードをコピー
上記で出来たディレクトリーに(2)で編集したソースコードを入れる。

(5) いろいろなファイルのコピー
元々のmlkitのモノが使える。package名に対応した変更は必要。
ただし、mlkitのモノをそのまま全部入れない。
AndroidManifest.xml、\res以下のリソースファイルを確認しながら内容や、ファイルをコピーした。

(6) Android Studio立上げ
syncやBuildなどを行う。エラーがでてくるのでよく見ると、
比較的容易に集積できる。
build.gradle は2つあるが、それぞれの確認も必要です。

ここは少し時間がかった。エラー修正を少し繰り返し30分程度試行錯誤。

(7)BuildとInstall
数回繰り返して、Android デバイスにインストール。
File > Invalidate Cashes /Restart.... も行い。
Buildしなおして、OK

obsolete とwarningがでるけど、、、なんでだろう?

packageを変える方法は、他にもWebに載っているので、、、

これで、楽しい事がいろいろできる。(^^)/

Peace!!


2019年7月11日木曜日

MariaDB 思いっきりドーンとtable 作成


#!/bin/bash

DB=DB名
USER=ユーザ名
PW=パスワード

#CLMS1="tana, date, hinc, kata, katad"
#select count(*) from $TBL1 where $1 like "$2";
#select $CLMS1 from $TBL1 where $1 like "$2";
#show columns from zaiko;

mysql -u$USER $DB -p$PW << EOS
create table counters (name char(16), value int);
create table seibans (
seiban_id int,
seiban char(8),
seiban_name varchar(120),
hd_kpn int,
hd_end_id char(5),
hd_end_at char(14),
person_id char(5),
create_at char(14));
create table units (part_number int,rev_cnt int,hinc char(32),hink char(3),updata_header_count int,update_data_count int,drawing_name char(30),parts_numbers int,effect_records int,model_name varchar(120),unit_name varchar(120),model_code char(12),target_roth char(10),drawing_number_old char(30),quantity int,approval_id char(5),approval_at char(14),update_design_id char(5),update_design_at char(14),drawer_id char(5),update_drawing_at char(14),start_at char(14),end_at char(14),disabled_at char(14),regist_id char(5),regist_at char(14),update_id char(5),update_at char(14),delete_id char(5),delete_at char(14));
create table hd (
seiban char(8),
seiban_id int,
pos int,
update_info varchar(120),
code char(10),
layout_no varchar(120),
sharp varchar(6),
name varchar(120),
kata varchar(120),
spec varchar(120),
maker varchar(60),
members int,
total_members int,
payout_flag char(1),
remarks varchar(120),
update_reason varchar(120),
del_flag char(1),
kpn int,
tana char(32),
part_number int,
hinc char(32),
hink char(3),
regist_id char(5),
regist_at char(14));
EOS

Peace!!


#!/bin/bash

#!/bin/bash

DB=DB名
USER=ユーザ名
PW=パスワード

#CLMS1="tana, date, hinc, kata, katad"
#select count(*) from $TBL1 where $1 like "$2";
#select $CLMS1 from $TBL1 where $1 like "$2";
#show columns from zaiko;

mysql -u$USER $DB -p$PW << EOS
create table counters (name char(16), value int);
create table seibans (
seiban_id int,
seiban char(8),
seiban_name varchar(120),
hd_kpn int,
hd_quantity int,
hd_dest char(64),
hd_fjkn char(4),
hd_end_id char(5),
hd_end_at char(14),
person_id char(5),
create_at char(14));
create table hd (
seiban char(8),
seiban_id int,
pos int,
update_info varchar(120),
code char(10),
layout_no varchar(120),
sharp varchar(6),
name varchar(120),
kata varchar(120),
spec varchar(120),
maker varchar(60),
members int,
total_members int,
payout_flag char(7),
remarks varchar(120),
update_reason varchar(120),
del_flag char(1),
kpn int,
tana char(32),
part_number int,
hinc char(32),
hink char(3),
regist_id char(5),
regist_at char(14));
EOS



Shell scripts for MariaDB


1.mariaDBをログインしないでShell Scriptで使う例


#!/bin/bash

# variable check
if [ $# -ne 2 ]; then
    echo -n "Usage: "
    echo -n `basename $0`
    echo  " target-clolumn target-word"
    exit 1
fi

DB=データベース名
USER=ユーザ
PW=パスワード
TBL1=テーブル名
#CLMS1="tana, date, hinc, kata, katad"
CLMS1="tana, hinc, kata, katad"

mysql -u $USER -p$PW $DB << EOS
#select count(*) from $TBL1 where $1 like "$2";
select $CLMS1 from $TBL1 where $1 like "$2";
#show columns from zaiko;
EOS

上記を呼び出して使うShell Script

#!/bin/bash

DT=`cat ./target1.txt`
while read line
do
    #echo -------------------------------------------------
    tt=$line
    echo ">>> $tt"
    ./slct01.sh kata $tt
    #echo $line
done << FILE
$DT
FILE

2.バックアップ用のShell script

#!/bin/sh
# Set mask for other user cann't read
umask 077

# backup file
# Retention period
period=31

# directory for backup files
dirpath='/home/pi/backup/mysql'

# backup file naming
filename=`date +%y%m%d`

#DB=データベース名
USER=ユーザ
PW=パスワード

# excute
mysqldump --opt --all-databases --events --default-character-set=binary -u$USER --password=$PW | gzip > $dirpath/$filename.sql.gz

# delete old backup files
oldfile=`date --date "$period days ago" +%y%m%d`
rm -f $dirpath/$oldfile.sql.gz

3.テストデータを insert する時の例

例は、2つのテーブルにテスト用の値を設定している。
テーブルのデータを削除するのは、

truncate seibans;
truncate  counters;

#!/bin/bash

DB=データベース名
USER=ユーザ
PW=パスワード
TBL1=seibans
TBL2=counters

# 配列宣言(-a)
declare -a sbn=()
# 初期化
declare -a sbn=("11111-11" "12345-76" "88888-99" "12345-56" "12345-89" "99999-00" "12345-66" "19625-01" "12345-67" "19625-02")

i=0
j=0
for e in ${sbn[@]}; do
    #echo "sbn[$i] = ${e}"
    let i++
    let j++
    aa=`date '+%s' | awk '{print strftime("%Y%m%d%H%M%S", $1)}'`
mysql -u $USER -p$PW $DB << EOS
insert into $TBL1 values ($j, '${e}', '${e}', 0, '11111', '$aa', '11111', '$aa');
EOS
done

mysql -u $USER -p$PW $DB << EOS
insert into $TBL2 values ('payouts', 1);
insert into $TBL2 values ("seibans", 1);
EOS

Peace!!

MyLife

僕の趣味は、こんな感じ、、、
この為に、働いているのだぁ、、、はず (^^)
Kayak, Climbing, Music, Skateboard, Airplane

Kayak

いきててよかった。良い子は真似しないようにね。

ハンドロール

2019年 春遠征

古い写真

Climbing

前穂高岳登頂(徳沢ー奥又白池泊ーA沢ー前穂高岳)

Music

Please wait!!

Skateboard

Please Wait!!

Air Plane

Soon!!

Peace!!

Robotics

僕が開発してるロボットについて、要素技術も含めてまとめ?
いえ、自分の整理用

1.開発ポリシー、概要

自律搬送クローラロボットの開発情報のまとめページ

2013年に最初に書いたロボットの 考え方
基本は変わっていません。

2.RDCS



3.要素技術

3.1 SLAM関係
Raspberry Piで、低コスト Lidar SLAMTEC RPLIDAR A2 を使う

Peace!!

はじめに、、、再出発

再出発します。。。

2019国際ロボット展に出展するので、、、
超バタバタ、、、

少しづつ書きます。



昔の "はじめに" は  こちら

Peace!!

Install

インストール関連をまとめました。

1. Lighttpd

インストールShell

2. MySQL ans MariaDB

Raspberry Pi に インストール

X. 本を書いたときのインストール関連

こちら、、、

Peace!!

Raspberry Piで製造業向け業務システム開発

主に製造業の業務システムをRaspberry Piを使って開発しています。
それに関係する情報をまとめている

<特徴>
・倉庫管理、製造現場への払いだしをAIAGVを活用し統合的に行うシステムです。
・生産管理システムと連動し、実棚管理を行います。在庫評価シミレーションも行えます。
・各種伝票、倉庫内の部品のシールをスマフォ上でAIを使った自動認識し他システムと連します。
     受注管理システムへの手入力
     従来の棚卸(棚卸表→EXCEL→システム取込み)工程を無くします。
・倉庫管理(受入れ、入出庫:棚管理、製造計画に基づいた払出し)をAIを搭載したスマフォを使って効率的に行います。
AGVとの連携も行い、複数の払出を同時に行います。
・払出し、出庫は最小経路を算出し、スマフォに画面に表示、もしくはAGVのコンソールに表示します。
・電脳(株式会社エクサ)と連携可能です。
・サーバはRaspberry Piを業務システム用にハードウェア面を補強し活用しています。それにより圧倒的なコストパフォーマンスを実現します。

こんな感じかなぁ(笑)
以下は、その為の要素技術の忘備録、、、

1.MariaDB

コマンドをまとめた

テスト用DBを初期化し作成するシェル
開発中は、繰り返し使うので便利

shell script で MariaDBにアクセスする

mysqlでインポートしたDBのユーザのパスワード再設定


MariaDB 思いっきりドーンと シェルでtable 作成


2.Android

Android Studioの小ネタ

mlkit#901をシンプルに動かすためのメモ

mlkit#901 シンプルに動かす 変更編

mlkitのPackageを変える(意外と手間)

Peace!!

MariaDB memo

開発で、日常的に使うのでメモ

(1) 検索について

結局大事なのは検索で、メモとして追加
NULL 検索をするとKeyも無視するらしいので、NULLを使ってはならない。

棚番号にXXXXが入って無く、かつdataに20%の値が設定されている。
select tana,hinc from zaiko where tana != "XXXX" and date like '20%';

カラムをグレイヴ アクセントで囲み検索条件をシングルクォーテーション
select count(*) from zaiko
where `tana` like '%CHC%' and `data` like '20%';


(2) Login

mariadb -uroot db -pxxxxx
mariadb -uroot -p -h ホスト名


(3) DB処理

select * from zaiko;
select * from zaiko where id = 10;
select * from zaiko where hinc like('% style="font-size: 10pt;"%');

insert into counters values('payouts', 0);
insert into counters values('seibans', 0);insert into users (name) values ('かばかば');
insert into profiles (name) select users from users where users.id = 1;
update users set name='kayak', status=3 where id=1;
delete from wakuwaku where kimoti like "waku%" and fuku <> "hadaka";

・例)検索してREPLACEで置換
update ship set post_kayakp = replace(post_content, 'style="font-size: 12pt;"', '') where kayak like('% style="font-size: 12pt;"%');


(4) DB import export


・import
入力ファイルはテーブル名
mysqlimport -uthn -pxxxxux --fields-terminated-by="|" 
 --lines-terminated-by="\n" --local test /home/pi/tmp/t1.csv
test.t1: Records: 21  Deleted: 0  Skipped: 0  Warnings: 0

mysqldump -uuser  -p -t database table1 table2 ... > backup-file.sql

DBの場合
mysql -uuser -p database < backup-file.sql

・export
出力先は/tmpにしないとエラーになる。
DB名test, DB内にはtable名t1のみ、結果は  /tmp/t1.txt  となっている。
sudo rm /tmp/t*; mysqldump -uroot -pxxxxx --tab=/tmp  
 --fields-terminated-by='|' test

・コマンドライン
load data local infile “./test.csv” into table t1
 fields terminated by “,” lines terminated by “\r\n”;
出力先は/tmpにしないとエラーになる。
select * fromt1 into outfile ‘/tmp/te.csv’ 
 fields terminated by ‘|’ lines terminated by ‘\n’;


(5) DB, Table 作成、管理


・DB作成
create database DB名称;

・DB削除
drop database DB名称;

・例)DB作成とテーブル作成
create database wm;
create table wm.zaiko(hinc CHAR(32),
 hin CHAR(35),
 kazu int(6),
 hink CHAR(3),
 kata CHAR(200),
 hin2 VARCHAR(300),
 tana CHAR(32),
 yearin char(4),
 monthin char(2),
 date char(14),
 koushin datetime,
 other VARCHAR(256)
);
Query OK, 0 rows affected (5.89 sec)

・例)テーブル作成
cretat table t1(id int, name varchar(128), atr varchar(128));
  `id` int(11) default null,
  `name` varchar(128) default null,
  `atr` varchar(128) default null,
  `txt1` varchar(128) default null,
  `txt2` varchar(128) default null
) engine=InnoDB default charset=utf8mb4;

・テーブル確認
describe t1; 

・プライマリーキーの追加
alter table テーブル名 add primary key (カラム名);

・カラム名と型を変更
alter table `posts` change column `txt` `caption` varchar(255);

カラムの名前だけを変更する場合でも、上記のように型指定が必要
not null制約を追加する場合です。カラム名の制約を追加

alter table `posts` change column `txt` `caption` varchar(255) not null;

・カラムの型を変える
alter table `comments` modify column `post_id` bigint not null;

・カラム追加
alter tableとADDを使用してカラムを追加。
after 指定でpasswordカラムの後ろに、kayak_idカラムが追加
先頭に追加する時は、first  を指定する。

alter table `users` add `kayak_id` int(11) default null;
alter table `users` add `kayak_id` int(11) default null after `password`;
alter table `users` add `kayak_id` int(11) default null first;
alter table t1 addtxt2 varchar(128);
alter table t2 addtxt1 varchar(128) after txt1;
alter table seibans add fjkn char(4) after hd_kpn;
alter table hd add payout_flag char(7) after total_members;

・カラム削除
alter table hd drop payout_flag;

・テーブル内のデータを削除する。データだけの削除。
truncate t1;

・テーブルを消す
mariadb -uuser database -p 
drop table if exsts table1, table2,,,,;


(6) Utility


status;
show databases;
show columns from zaiko;
select count(*) from zaiko;
select version();
show variables;
show variables like "char%";
show variables like 'slow%';

use mysql;
select * from user;


(7) ユーザ管理


・ユーザー確認
select user from mysql.user;

・ユーザ追加とパスワード設定
create user 'ユーザ名'@'localhost' identified by 'ここにパスワード';
create user 'kayak'@'localhost' identified by 'password';

・ユーザーのパスワードを変更
set password for kayak@localhost=password( 'kayakPassword' );

・ユーザーを削除
drop user ユーザー名@ホスト名;

・ユーザー権限を確認
show grants for wordpress@localhost;
show grants for 'kayak'@'%';

・権限を追加 
grant all privileges on DB名.テーブル名 to 'ユーザ名'@'localhost';
mariadb 10.1.37では、上記のDB名.テーブル名は、シングルコーテーションで
囲むとエラーになる。従って、下記のようにする。
grant all privileges on TESTDB.* to 'user'@'localhost';

grant select on `kayakdb`.`users` to 'kayak'@'%'
grant file on *.* to kayak@localhost;

まとめると、、、
・グローバルレベル.sql
全DBの全テーブルに対して、与える権限を与える
grant 与える権限 on *.* to user名;

・データベースレベル.sql
指定したDB名の全テーブルに与える権限を与える
grant 与える権限 on DB名.* to user名;

・テーブルレベル.sql
指定したDB名の指定したテーブル名に与える権限を与える
grant 与える権限 on DB名.テーブル名 to user名;

・変更を反映さえる
flush privileges;


(8)開発環境を作る


sudo apt-get install default-libmysqlclient-dev
gcc slct01.c -o slct01 -lmysqlclient -L/usr/lib/arm-linux-gnueabihf

libmariadbclient-dev は、必要無いのかしら、、、


 Peace!!

2019年6月30日日曜日

mlkit#901 シンプルに動かす 変更編

Google FireBaseは、凄いスピードで進化している。
サンプルプログラムも、どんどん変わっている。
ただし、どんどん洗礼化されているので、コードを見ることはMlKitを活用する上では
欠かせない。
そして、それをベースに検証もするのだけど、新しい依存するモジュールが動かなくなっていたりと、、、
今回は、ビデオ画像を認識の元データとして使う場合の設定と、
Version Controlのメモ

(1)ビデオ画像を使う

カメラとGraphicのオーバーライト処理が必要になるわけで、
それは、プログラムをガンガンいじるイメージではなく、
カメラとオーバーライトを、Layoutで設定し
IFを使って取得して処理をする感じ。
その全体像が分かる写真がした。僕は、わかる。メモだからいいでしょう(笑)
オッチョコチョイナ僕が時間を使ってしまったのが、
#901が、カメラとオーバーライト処理のモジュールがcommonにまとめられた事に
頭がついていかず、以前の場所を指定したまま処理をしたので、落ちまくり。
プログラムの方ばっかりを見ていたけど、実はレイアウト定義だった。

(2) Version Control

Android Studioにクラスを作るのだけど、階層構造で表示される画面には、
クラスが赤くなったまま。かつクラスを活用することができない。
これも、数時間使ってしました。

File > Setting > Version Control 
あれ? Gitになっている。これをnoneの指定にするとお見事!
 
 Androidのプログラムばっかり作っているわけではなく、
物忘れも早くなり、こんな事を繰り返しながら進んでいます。
#901になって認識速度、むっちゃ早くなった。

で、良いアイデアが下りてきたのだぁ (^^)/

AndroidManifestも今回は、理解できてうれしかったなぁ。
モジュールを沢山作っても、交通整理して使える。
これは楽しいのでした。



追記

(3) Android 9(Pie)のセキュリティ

実は、セキュリティが厳しくなっており、HTTP通信を使う場合には、
セキュリティ設定をしないとならないのだぁ
いろいろなセキュルティ指定の方法があるけど、一番簡単なでも推奨されないやり方で一応、一応、一応の設定。
おまじないは、、、
android:usesCleartextTraffic="true"

Peace!! 

mlkit#901をシンプルに動かすためのメモ

起動までをメモ

1.windows に gitをセットアップ
ダウンロードして、インストール
https://gitforwindows.org/
何故か、画面のdownloadボタンの動きがおかしく、画面左上のバージョンをクリックして、変わった画面から64bit版をダウンロード

2.firebase quickstart-android ダウンロード
上記でセットアップした、Git Bashを使う。
セットアップしたいディレクトリーに移動をしコマンド入力する。
git clone https://github.com/firebase/quickstart-android.git

3.Firebase構成ファイルの追加
ディレクトリーmlkit/appに配置する
Firebaseに登録した時に、DownloadしたJsonファイル

4.Firebase AndroidManifast.
mlkitは、日々変更が加えられている。昨年のmlkit内容とは変わっている。
特に、僕が最初に使った時からは、kotlinのサンプルが追加されており、
起動時の画面でjava、kotlinの選択画面が現れる。


これは不要なので、Manifestを書き換えて、起動画面を変える。
インストール後のAndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.google.firebase.samples.apps.mlkit">

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/MaterialTheme">
        <meta-data
            android:name="com.google.firebase.ml.vision.DEPENDENCIES"
            android:value="barcode,face,ocr,ica" />

        <activity
            android:name="com.google.firebase.samples.apps.mlkit.java.ChooserActivity"/>

        <activity
            android:name="com.google.firebase.samples.apps.mlkit.kotlin.ChooserActivity"/>

        <activity
            android:name="com.google.firebase.samples.apps.mlkit.EntryChoiceActivity"
            android:exported="true"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".java.LivePreviewActivity" android:exported="true">
        </activity>

        <activity android:name=".kotlin.LivePreviewActivity" android:exported="true"/>

        <activity android:name=".java.StillImageActivity"
            android:exported="true">
        </activity>

        <activity android:name=".kotlin.StillImageActivity"
            android:exported="true"/>
    </application>

</manifest>

変更後のAndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.google.firebase.samples.apps.mlkit">

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/MaterialTheme"
        tools:ignore="GoogleAppIndexingWarning">
        <meta-data
            android:name="com.google.firebase.ml.vision.DEPENDENCIES"
            android:value="barcode,face,ocr,ica" />

        <activity
            android:name="com.google.firebase.samples.apps.mlkit.java.ChooserActivity"
            android:exported="true"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".java.LivePreviewActivity"
            android:exported="true" />

        <activity android:name=".java.StillImageActivity"
            android:exported="true">
        </activity>

    </application>

</manifest>

あとは、ソースを眺めて確認、確認

Peace!!



2019年6月4日火曜日

mysqlのバックアップメモ

忘備録

1. backupシェル

#!/bin/sh
# Set mask for other user cann't read
umask 077

# backup file
# Retention period
period=31

# directory for backup files
dirpath='/home/pi/backup/mysql'

# backup file naming
filename=`date +%y%m%d`

# excute
mysqldump --opt --all-databases --events --default-character-set=binary -u root --password=xxxxxxxxx | gzip > $dirpath/$filename.sql.gz

# delete old backup files
oldfile=`date --date "$period days ago" +%y%m%d`
rm -f $dirpath/$oldfile.sql.gz

2. sudo  crontab -l

0 2 * * *  /home/pi/prj/sql/mysql_backup.sh > /tmp/cron-bk.stdout 2 > /tmp/cron-bk.stderr || [ $? -eq 1 ]

3. WIndowsマシンへのバックアップ

Peace!!

cron 設定の悲劇

cron使って、mysqlのデータバックアップを行う設定をしたのだけど、、、

ネット情報をまともに信じてしまい半日無駄にしたというアルアル

ネットでは、コマンドの前に "root"が入っていた。
何も考えすに、そのまま転記し起動時間だけ変更
手動では動くshellが、errorになる

結局、crontabの書式のように 起動時間設定の後は

コマンド

コマンド

です。

起動ユーザなんて入れてはいけない

他の機種とOSの場合は解らないが
Raspberry Piと、Stretchは コマンド

Peace!!

2019年6月2日日曜日

mysqlでインポートしたDBのユーザのパスワード再設定

mysql + raspberry pi で、業務システム開発中

当然バックアップとりますが、それを開発用のマシンにインポートのメモ

mysql -uroot -prルートのパスワード  < 190530.sql

開発用のユーザ(xxx)でログインできない

$ mariadb -uthn -p
Enter password:
ERROR 1045 (28000): Access denied for user 'xxx'@'localhost' (using password: YES)

$mariadb -uroot -p

update mysql.user set password=PASSWORD('1234567') where user='xxx';

ただ、上記の処理をしてもダメな時があり、、、

MariaDB [(none)]> flush privileges;
MariaDB [(none)]> show grants;
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*8637AD513CC7ED5F46D72CD7C3C587CFC9522613' WITH GRANT OPTION |
| GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION                                                                          |

+----------------------------------------------------------------------------------------------------------------------------------------+

あれ?
MariaDB [(none)]> grant all privileges on *.* to 'thn'@'localhost';
MariaDB [(none)]> flush privileges;

OK

Peace!!

2019年4月29日月曜日

自律搬送クローラロボットの開発情報のまとめページ

某自動車メーカと共同開発のクローラを使った自律走行ロボット

ところで、開発でバタバタでベースになるソフトなどが整理できていない。
これはやばいので、ここで整理。

ロボットシステム開発の基本的な考え方
「安全を最優先、次にパフォーマン→最もコンパクト、最速に動くシステム」

従って、安全を最優先にしたアーキテクチャーのもとに、C言語で開発している。
アーキテクチャーはこんな感じ(笑)

もちろん、Pythonも使わないとならないところでは使っているけど
例えば、linux の top コマンドで確認し見るとよい。
pythonがどれだけCPU負荷をかけるのか?

ロボット制御システム
RDCS  僕が開発した、汎用のロボット制御システム
数百人の人、数百台のロボットが、数百の仕事を、数百の場所で協調分散しながら、
安全第一に行う為の基本プラットフォームと、
自律搬送、pickingなどの制御システムなどで構成されている

7月位にAGV部分は切り出して、Amazonで販売しようと計画中
駆動系のドライバーの追加により、どのような搬送機器もロボット化可能

この中は複雑で、SLAMや、4次元のMappingシステムが実装されていたり
良く説明できませんが、自律走行に必要な機能の塊ね。

C言語で記述、APIはC言語、python
  RDCSとは(6年前の投稿)---> What's RDCS

1.ハードウェア

1.1 ベース車体

某社のCAN制御可能なクローラ。もともとは除雪機なのだぁ。
積載重量
傾斜20度:130Kg
平地:200Kg

1.2 コントローラ

Raspberry Pi 3B+ (メイン) + 用途に応じた性能のRaspberry Pi

1.3 システム通信(CAN Ver 2.0)

CANネットワークを2系統制御する。
・駆動系CAN
駆動系を制御するCANネットワーク。仕様は駆動系メーカの仕様に準拠する。
・RDCS CANネットワーク
RDCS内の通信を制御するネットワーク。
ロボット内に複数のRaspberry Piを搭載し、協調分散処理が可能となる。

PICAN DUO  Rev 01/16
MCP2515  このようなモノ

1.4 車体制御

センサー制御ボード (クローラ側センサーを始動位置/走行位置にする為の工作)
ロボット制御側CANネットワーク通信基板

1.5 稼働状態を外部から確認可能なデバイス

FULL Color LED 2個
16x2 桁 LCD

1.6 操作デバイス

スマフォ
Joystick  (bluetooth接続)

1.7 センサー系

GPS (マゼランジャパン社製のGPSを借用。今後は秋月で売っているモノでOK)
Lidar(主にAGV用)
Intel D4351 (ToFセンサー)
Intel T265(自己位置推定)
ステレオカメラ(今後は不使用の予定)
VL53X0L(衝突防止センサー)
積載重量センサー
基準点センサー(AGVにおいて、作業空間の基準点になるもの)

1.8 Edge Device

Movidius または、Coral (検証中)

1.9 通信

Wifi
Bluetooth
920MHz帯通信 (マルチホップ通信)

2.ソフト

2.1 自律走行システム

前述「ロボット制御システム」参照

2.2 Raspberry Pi OS

Rasbian Stretch
Raspberry Piに最も最適化されたOS。
いろいろなOSでテストしたけどパフォーマンが最も高い
本当は、ArchLinuxに期待してたけど、Rasbianにはかなわない。

・service (/lib/systemd/system)
lighttpd.service

・service (/etc/systemd/system)
pigpiod.service
hndjs.service
rdcs_joystick.service
rdcs_if_01.service

・/etc/rc.local
home/pi/prj/hnd/bin/setcan.sh

2.3 各種ソフト

個別にインストールする必要があるソフト

・インストール基本
/home/pi/rdcs/bin , src, etc
/var/www/api/rdcs/v1/bin, etc. tmp

・環境変数
~/.bash_profile
RDCS=/home/pi/prj/rdcs
export PATH=".:$RDCS/bin:/home/pi/bin:/home/pi/.pyenv/bin:$PATH"$

・CAN関連
システムの中では、C言語で制御している
PICAN DUO  : 2系統のCANネットワークを制御する
MCP2515  : RDCSのCANネットワークノード。120Ωでターミネーター両端設定

・pigipio
システムの中では、C言語 + python (非同期処理)で開発している
PWM制御をすためのユーティリティ。Raspberry Piでは最も性能が良い。
インストールは、sudo apt install pigpio

・HTTP通信
C言語で開発している。
lighttpd 軽量高速なWebサーバを使って外部から制御可能
インストール

・深層学習
Python + C++言語で開発している
Tensorflow
インストールはネットで最新情報を探してください。

・画像処理
OpenCV 4.0
システムの中では、C++ & C言語で開発している
インストール

・Lidar
システムの中では、C言語で制御している
インストール

・Full Color LED
システムの中では、C言語で制御している
インストール

・16x2 LCD
システムの中では、C言語で制御している
インストール

・Bluetoothとjoystick
システムの中では、C言語で制御している

インストールと設定、確認
sudo apt-get install joystick
sudo apt-get install -y pi-bluetooth
sudo apt-get install libbluetooth-dev
sudo apt-get install joystick
sudo apt-get install jstest-gtk

bluetoothctl
scan on
scan off
pair XXXXXXXXXXXXX
trust XXXXXXXXXXXXX
show
info
exit

3.クラウド

3.1 インターネット上にクラウド
それを経由して全世界にあるロボットを制御することが可能。
そしてそれらのデータを再活用することができる。

3.2 ローカルサーバ

企業によってはクラウド接続が許されない場合がある。
その場合にはローカルサーバを設置して運用を行う。
また同一企業内ならローカルサーバを接続し様々な情報の共有も可能となる。

4.連動システム(利用者の目的)

4.1 倉庫管理システム

深層学習を活用したUIに、Android スマフォン を使うシステム
実在庫誤差3%以下を目指して、受け入れから払い出しまで一貫した
処理を提供する。またAGVと連動して、さらなる効率化を図る。

DBは、Raspberry Pi 3B+、DBはMariaDB。

少しづつ追記します。
いろいろ開発したなぁ。。。

Peace!!

軽量高速Webサーバ lighttpd 1.4.54 を一発でbuild & installする スクリプト

lighttpd 1.4.54 を一発で、僕の環境用にBuild, インストールします。
ヒアドキュメントのエスケープシーケンスは'\'でした。

lighttpd 最新版のチェックはしてください。
URLは、こちら

Peace!!



#!/bin/bash

HOME=/home/pi
VER=1.4.53

if [ -e $HOME/tmp ]; then
    cd $HOME/tmp
else
    mkdir $HOME/tmp
    cd $HOME/tmp
fi

##########################
# 1. build lighttpd
##########################
wget https://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-$VER.tar.gz
tar xvf lighttpd-$VER.tar.gz
cd  lighttpd-$VER
sudo apt-get -y install libpcre3-dev bzip2 libbz2-dev
./configure
make
sudo make install
sudo ldconfig

##########################
# 2. setup config
##########################
sed -i -e "s/srv/var/g" doc/config/lighttpd.conf
sed -i -e "s/server.use-ipv6/\#server.use-ipv6/g" doc/config/lighttpd.conf
sed -i -e "s/server.username  = \"lighttpd\"/server.username  = \"www-data\"/g" doc/config/lighttpd.conf
sed -i -e "s/server.groupname = \"lighttpd\"/server.groupname = \"www-data\"/g" doc/config/lighttpd.conf
sed -i -e "s/server_root + \"\/htdocs\"/server_root/g" doc/config/lighttpd.conf

sed -i -e "s:\#include \"conf.d/cgi:include \"conf.d/cgi:g" doc/config/modules.conf

sudo mkdir /etc/lighttpd
sudo cp doc/config/lighttpd.conf /etc/lighttpd
sudo cp doc/config/modules.conf /etc/lighttpd
sudo cp -r doc/config/conf.d /etc/lighttpd
sudo mv /etc/lighttpd/conf.d/cgi.conf /etc/lighttpd/conf.d/cgi.conf.org

cat << EOF > /tmp/cgi.conf
#######################################################################
##
##  CGI modules
## ---------------
##
## See https://redmine.lighttpd.net/projects/lighttpd/wiki/docs_modcgi
##
server.modules += ( "mod_cgi" )

##
## Plain old CGI handling
##
## For PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini.
##
#cgi.assign                 = ( ".pl"  => "/usr/bin/perl",
#                               ".cgi" => "/usr/bin/perl",
#                               ".rb"  => "/usr/bin/ruby",
#                               ".erb" => "/usr/bin/eruby",
#                               ".py"  => "/usr/bin/python" )
#
##
## to get the old cgi-bin behavior of apache
##
## Note: make sure that mod_alias is loaded if you uncomment the
##       next line. (see modules.conf)
##
#alias.url += ( "/cgi-bin" => server_root + "/cgi-bin" )
alias.url += ( "/api" => server_root + "/api" )
\$HTTP["url"] =~ "^/api" {
   cgi.assign = ( "" => "" )
}
############################
############################
EOF

sudo cp /tmp/cgi.conf /etc/lighttpd/conf.d

##########################
# 3. setup systemd
##########################
sudo mkdir /var/log/lighttpd
sudo chown www-data:www-data /var/log/lighttpd

cp  doc/systemd/lighttpd.service  doc/systemd/lighttpd.org
sed -i -e "s/sbin/local\/sbin/g" doc/systemd/lighttpd.service
sudo cp doc/systemd/lighttpd.service /lib/systemd/system
sudo systemctl enable lighttpd.service
sleep 1
sudo systemctl start lighttpd.service

##########################
# 3. test lighttpd
##########################
sudo mkdir /var/www
sudo mkdir /var/www/api

cat << EOF > index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>lighttpd alive</title>
</head>
<body>
<p>lighttpd server success/p>
</body>
</html>
EOF

sudo cat << EOF > tst.c
#include <stdio.h>
void main(){
    printf("Content-type: text/plain\n\n");
    printf("Hello, World!");
    return;
}
EOF

gcc tst.c -o tst

sudo mv index.html /var/www
sudo mv tst.c /var/www/api
sudo mv tst /var/www/api
sudo chown -R www-data:www-data /var/www

exit 0

2019年4月25日木曜日

Raspberry Piで、低コスト Lidar SLAMTEC RPLIDAR A2 を使う

自律走行といえば、SLAM。
SLAMと言えば、Laidr
Lidarと言えば、高い
でも、えええええ、、、という事で、これ!


上を見ればきりがないけど、これで十分

ソフトはここからdownloadし、解凍する。

cd rplidar_sdk-master/sdk
make
cd output/Linux/Release
./ultra_simple


距離はmm単位。正面がtheta 0

次に、
./simple_grabber /dev/ttyUSB0


フフフ、良い感じでしょう(^^)

Peace !

2019年4月24日水曜日

Raspberry Pi と ネットワークプリンターを接続する

なんというか、あまりにもあっさりなので僕自身(@_@)

コマンドラインでやると大変なので、Desktop上からサクッと

1.cusp関連ソフトのインストール
Preference > add/remove software を使って, common unix printing systemをインストールする。

searchで、cuspと入れて検索するとターゲットになるソフトが一覧で現れる




必要なソフトを選択する。ここでドラーバーもインストールしたけど
それをここでするのか、後述でするのか?
僕は、個々でインストールしてしまった。

2.プリンターの選択
Preference > 印刷設定 を開くと下記の画面が出現する。Addを選択する


認証画面が現れるので、既にログインしているユーザのパスワードを入力する。
下記の画面が現れるので、Network Printer を選択すると、
現在ネットワークに接続されているプリンター一覧が現れる。
僕的には、おおおおおって感じで、感動しました。
昔は、プリンター接続するのが大変だったので、、、
対象のプリンターを選択して Forward ボタンを押下。
この時、右ペインの値は選択しない。


この画面が現れ、Print Test Page を押下するとプリンターに出力されます。




Peace !

2019年4月23日火曜日

Raspberry Pi にsamba を設定してwindows7 / 10で共有する

何も考えずにやったら、動かない(笑)

sudo apt-get -y update; sudo apt-get -y upgrade
sudo apt-get install samba
sudo vi /etc/samba/smb.conf

設定ファイルの最後に追加、ネット見ながら設定

[WareHouseDB2]
   comment = Raspberry Pi
   path = /home/pi/Public
   guest ok = yes
   read only = no
   browsable = yes
   force user = pi

sudo systemctl restart smbd


以下はメモ、、、最初にちゃんと動かなかった。
上の定義はすでになおしている

windows PCで、、、
あれ?見えない。

sudo systemctl status smbd

あれ?ない

sudo systemctl enable smbd
sudo systemctl start smbd

さぁ!

あれ?見えない。うーーーん

smb.conf .....

あっ、、、
browsable = no
これを、
browsable = yes

sudo systemctl restart smbd

おおお!!!

Peace!!

2019年4月22日月曜日

Raspberry Piに lighttpd をインストールするスクリプト

僕の環境でlighttpdを一発で設定するスクリプト。
いくつか投稿しているけど、これが今の最新版。

ただし、/etc/lighttpd 以下は設定しない。
/etc/lighttpdの設定が必要な場合はこちら(step3,step4後半)を参照。

僕は、多数のRaspberry Piを使っている。その為に、PCでRasbianをSDカードを書き込んだ直後に/bootに環境設定用のデータを書き込み、それを最初のRaspberry Pi立上げ時に、シェルスクリプトでインストールする。
その時に、/etc/lighttpdも、設定してしまう。

それを前提にして、こんな感じで処理をする。

#!/bin/bash

HOME=/home/pi
VER=1.4.53

if [ -e $HOME/tmp ]; then
    cd $HOME/tmp
else
    mkdir $HOME/tmp
    cd $HOME/tmp
fi

##########################
# 1. build lighttpd
wget https://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-$VER.tar.gz
tar xvf lighttpd-$VER.tar.gz
cd  lighttpd-$VER
sudo apt-get -y install libpcre3-dev bzip2 libbz2-dev
./configure
make
sudo make install
sudo ldconfig

##########################
# 2. setup systemd
sudo mkdir /var/log/lighttpd
sudo chown www-data:www-data /var/log/lighttpd

cp  doc/systemd/lighttpd.service  doc/systemd/lighttpd.org
sed -i -e "s/sbin/local\/sbin/g" doc/systemd/lighttpd.service
sudo cp doc/systemd/lighttpd.service /lib/systemd/system
sudo systemctl enable lighttpd.service
sleep 1
sudo systemctl start lighttpd.service

##########################
# 3. test lighttpd
sudo mkdir /var/www
sudo mkdir /var/www/api

cat << EOF > index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>lighttpd alive</title>
</head>
<body>
<p>lighttpd server success/p>
</body>
</html>
EOF

sudo cat << EOF > tst.c
#include <stdio.h>
void main(){
    printf("Content-type: text/plain\n\n");
    printf("Hello, World!");
    return;
}
EOF

gcc tst.c -o tst

sudo mv index.html /var/www
sudo mv tst.c /var/www/api
sudo mv tst /var/www/api
sudo chown -R www-data:www-data /var/www

exit 0

シェルは、これで終わり

次に確認で、以下の2つをブラウザーから順番に確認
http://192.168.xxx.yyy
http://192.168.xxx.yyy/api/test

これでうまくいけば、OK

Peace!!

2019年4月20日土曜日

合体(I2CキャラクターLCD & Full color LED PL9823 )

ロボット内の状態を外部から確認できるように、
ディスプレーと、LEDは必要
音も必要かなぁ。それは後、、、
まずは、スマフォで確認するよりはユーザに優しい
C言語で書いたから、負荷も最小限。
Pythonではこうはいかない。
性能を考えれば、少しでも軽く、早く!

今は、そういう時代ではないけどね。




Peace !!

2019年4月19日金曜日

Raspberry Pi でキャラクターディスプレーを使う


Raspberry Piで処理している情報を表示するために、16桁2行のモジュールを使う


Raspberry Piに接続した情報が多い これ(秋月のページ)を使う。
あと、家にあったので可変抵抗(100Ω)を使います。
V0に入力する電圧でデイスプレーの表示を調整するためです。
固定の抵抗を組み合わせてもよいし、モジュールの説明書にある回路でも良いと思います。

ところでi2c接続なので、
i2cdetect -y 1
とすると見えるはずですが「見えない」。
見えない事は気にしないで進める。
色々調べると、モジュールのPICの処理に問題があるようで0x50に出てこない。
スレーブアドレス:0x50
レジスタアドレス:
 コマンド 0x00
 データ    0x80

基本的なツールのインストール
sudo apt-get install i2c-tools python-smbus

ドライバーのインストール(これは大事です)
sudo rmmod i2c-dev i2c-bcm2708         (おまじない)
sudo modprobe i2c-bcm2708; sudo modprobe i2c-dev

ボレートを設定します。
sudo vi /boot/config.txt
dtparam=i2c_baudrate=50000

reboot

テスト表示
sudo i2cset -y 1 0x50 0x00 0x01
sudo i2cset -y 1 0x50 0x00 0x38
sudo i2cset -y 1 0x50 0x00 0x0c
sudo i2cset -y 1 0x50 0x00 0x06
sudo i2cset -y 1 0x50 0x80 0x41
sudo i2cset -y 1 0x50 0x00 0xc0
sudo i2cset -y 1 0x50 0x80 0x42

sudo i2cset -y 1 0x50 0x00 0x01;sudo i2cset -y 1 0x50 0x00 0x38;sudo i2cset -y 1 0x50 0x00 0x0c;sudo i2cset -y 1 0x50 0x00 0x06;sudo i2cset -y 1 0x50 0x80 0x41;sudo i2cset -y 1 0x50 0x00 0xc0;sudo i2cset -y 1 0x50 0x80 0x42

これは、Aを表示するための設定
0x01 : Clear Display
0x38 : Set 2lines
0x0c : display on, no cursor
0x06 : no shift
0xc0 : return

0x41 : 文字 A
0x42 : 文字 B


Peace !!

2019年4月18日木曜日

フルカラー LED PL9823-F8 を Raspberry Piで使うメモ

マイコン搭載のPL9823-F8を、Raspberry Piでつかうためのメモ。
PL9823-F8は、秋月で購入。

こちらで書かれている事のポイントを実施しながら自分用にまとめました。
元の原稿は良く説明されていて解りやすいです。
感謝 m(__)m

ただ、Pythonのプログラムは、NeoPixel が開発したものであり、
このPython Libralyが本当の肝。
サンプルプログラムは、Ctl-Cがきちんと処理されていないので、
その部分だけ、下記のように直せばよい。
strandtest.py のif __name__ == '__main__': 部分の最後
Ctl-Cを受けるところが下記ようになっているが、それを修正する

修正前
    except KeyboardInterrupt:
        if args.clear:
            colorWipe(strip, Color(0,0,0), 10)
修正後
    except KeyboardInterrupt:
        colorWipe(strip, Color(0,0,0))

        if args.clear:
            colorWipe(strip, Color(0,0,0), 10)

ポイントは、PL9823-F8 に内臓されているマイコンWS2812の制御モジュール。
これは、公開されている。それを使ってPL9823-F8を制御する。

(1) /boot/config.txt の変更
# dtparam=audio=on

sudo sed -i -e "s/^dtparam=audio=on/# dtparam=audio=on/g" /boot/config.txt

(2) 必要なモジュールのインストール
cd ~/prj
僕は、開発するディレクトリーとして~/prjを使っている。
プロジェクト毎にディレクトリーを作って管理している。
理由は、バックアップや複数のRaspberry Piを使っているので管理が楽だから。
例えは、ロボット一台に3つのRaspberry Piなんかつかうし、ルール決めて管理しないと大変です。脱線した(笑)

sudo apt-get -y install build-essential python-dev git scons swig
git clone https://github.com/jgarff/rpi_ws281x.git
cd rpi_ws281x
scons
cd python
sudo python setup.py install
cd examples
vi strandtest.py
sudo sed -i -e "s/^LED_COUNT      = 16/LED_COUNT      = 8 /g" strandtest.py
sudo sed -i -e "s/^LED_PIN        = 18/LED_PIN        = 12/g" strandtest.py
sudo sed -i -e "s/^LED_BRIGHTNESS = 255/LED_BRIGHTNESS = 8  /g" strandtest.py


配線は、こんな感じ
GNDは、一番長い端子
VDDには100Ωの抵抗をはさんでRaspberry Piの3.3V電源を使っている
DINは、GPIO12
DOは使っていない




Peace!!

以下は、点灯したままのLEDを消すプログラムでけど、
上記のCtl-Cを処理する部分を加えれば使わない。


# NeoPixel library strandtest example
# Author: Tony DiCola (tony@tonydicola.com)
#
# Direct port of the Arduino NeoPixel library strandtest example.  Showcases
# various animations on a strip of NeoPixels.
import time

from neopixel import *

# LED strip configuration:
LED_COUNT      = 8       # Number of LED pixels.
LED_PIN        = 12      # GPIO pin connected to the pixels (must support PWM!).
LED_FREQ_HZ    = 800000  # LED signal frequency in hertz (usually 800khz)
LED_DMA        = 5       # DMA channel to use for generating signal (try 5)
LED_BRIGHTNESS = 8       # Set to 0 for darkest and 255 for brightest
LED_INVERT     = False   # True to invert the signal (when using NPN transistor level shift)

# Define functions which animate LEDs in various ways.
def colorWipe(strip, color, wait_ms=0):
        """Wipe color across display a pixel at a time."""
        for i in range(strip.numPixels()):
                strip.setPixelColor(i, color)
                strip.show()
                time.sleep(wait_ms/1000.0)

# Main program logic follows:
if __name__ == '__main__':
        # Create NeoPixel object with appropriate configuration.
        strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS)
        # Intialize the library (must be called once before other functions).
        strip.begin()

        colorWipe(strip, Color(0, 0, 0))  # clear wipe

2019年4月16日火曜日

Connect Raspberry Pi and ACGAM R1 using Bluetooth

Amazonで購入したJoystickでロボットを動かしたく、設定した記録


搬送ロボットの学習行動や、所定の場所まで移動させるにはスマフォ片手というのは危険であり、やはり簡単な操作機器でするのが良いと思うわけでして、、、

通常Raspberry PiにはDesktop入れないので、コマンドラインでBluetoothとの接続をする。まずは、そこまでの記録。

sudo apt-get install -y pi-bluetooth

これによりsystemd配下のサービスとなる。はず、、、
で、

systemctl status bluetooth

なんとエラー、、、

Failed to obtain handles for "Service Changed" characteristic
Sap driver initialization failed.
sap-server: Operation not permitted (1)
Endpoint registered: sender=:1.26 path=/A2DP/SBC/Source/1
Endpoint registered: sender=:1.26 path=/A2DP/SBC/Sink/1

cat /etc/dbus-1/system.d/bluetooth.conf

確認するとパーミッション設定必要。

sudo usermod -a -G bluetooth pi
sudo reboot

bluetoothctl

scan on
おおおおお、、、で

scan off
connect FF:FF:30:01:0B:2A
Connection successful
pair FF:FF:30:01:0B:2A
Paring successful
trust FF:FF:30:01:0B:2A
Trust successful

info

device FF:FF:30:01:0B:2A
        Name: ACGAM R1
        Alias: ACGAM R1
        Paired: no
        Trusted: no
        Blocked: no
        Connected: yes
        LegacyPairing: no
        UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
        UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
        UUID: Device Information        (0000180a-0000-1000-8000-00805f9b34fb)
        UUID: Battery Service           (0000180f-0000-1000-8000-00805f9b34fb)
        UUID: Human Interface Device    (00001812-0000-1000-8000-00805f9b34fb)
        Modalias: usb:v248Ap8266d3634

めでたしめでたし(^^)

sudo apt-get install joystick
sudo apt-get install jstest-gtk

jstest-gtk

おっと、この画面が現れて "Properties" を選択して、ぐにゅにゅ



因みに、このパッドは、4つのモードがあって
・シャッターモード(自撮りモード)
・マウスモード
・音楽モード
・ゲームモード
デフォルト(初期設定)は「音楽モード」。
左側にある"M"キーを押しながら"B"キーを押すとモードが変わるけど、
ようわからん。青いLEDは光るので反応はしているようだ
ロボットの制御をするので、中間値はいらないので、これで十分なはず。

今度は、アプリをつくります。

sudo apt-get install libbluetooth-dev

Peace!!