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!!



2019年4月12日金曜日

lighttpd を一発でBuildする

lighttpd を一発でbuild する

まあまあ、この作業が僕は多いので、こんな感じのbash
Raspberry Pi用です。
あと、変数VERは下記を確認して必要に応じて修正する。

https://www.lighttpd.net/

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

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

2019年4月4日木曜日

mariaDB これだけ知っていれば困らないかも、、、

これだけ知っていれば、困らない
僕は、、、


(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 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

・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;

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

(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!!

memo:Raspberry Piにmysqlをインストールする

インストールでの問題は、rootのパスワード設定に技が必要な事
将来は解りませんが、、、

sudo apt-get -y install mysql-server

rootパスワードの設定をします。
いろいろ聞いてきますが、パスワード設定設定して、後はYで進めます。

sudo /usr/bin/mysql_secure_installation
return password password y,y,,,,,

この設定は、そのままでは有効になりません。
root は、デフォルトでpluginがunix_socketに設定されているので、
それを削除します。sudoで軌道していますが、、、

sudo mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 10.1.37-MariaDB-0+deb9u1 Raspbian 9.0

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> select user,password,plugin from user;
ERROR 1046 (3D000): No database selected
MariaDB [(none)]> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> select user,password,plugin from user;
+------+-------------------------------------------+-------------+
| user | password                                  | plugin      |
+------+-------------------------------------------+-------------+
| root | *8637AD513CC7ED5F46D72CD7C3C587CFC9522613 | unix_socket |
+------+-------------------------------------------+-------------+
1 row in set (0.00 sec)

MariaDB [mysql]> update user set plugin='' where user='root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [mysql]> select user,password,plugin from user;
+------+-------------------------------------------+--------+
| user | password                                  | plugin |
+------+-------------------------------------------+--------+
| root | *8637AD513CC7ED5F46D72CD7C3C587CFC9522613 |        
+------+-------------------------------------------+--------+
1 row in set (0.00 sec)

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.01 sec)

MariaDB [mysql]> exit
Bye

rootで、設定したパスワードでloginできるか確認します。

mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 11
Server version: 10.1.37-MariaDB-0+deb9u1 Raspbian 9.0

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

完了です。

あと、C言語で開発する時はライブラリー
sudo apt-get install default-libmysqlclient-dev

Peace !!