raspberry pi でカメラモジュール

raspberry pi でカメラモジュール

カメラモジュールを raspberry Pi 本体に追加し
電源を入れる

今回もamazon で購入してみた
使用したのは
ラズベリーパイ カメラモジュール Camera Module for Raspberry Pi

今回もリモートで実行

まず
SSH でログインして
次に

sudo raspi-config

で設定画面を開く

raspi_camera

設定で
Enable Camera を選択し

Enable support for Raspberry Pi camera
とカメラをサポートするか聞かれるので
Enable にして有効化

raspi_camera2

そして設定画面を終了すると再起動するか聞かれるので再起動

これで設定が反映されるので
撮影はコマンドからできる

しっかり接続できていないと

mmal: mmal_vc_component_create: failed to create component 'vc.ril.camera' (1:ENOMEM)
mmal: mmal_component_create_core: could not create component 'vc.ril.camera' (1)
mmal: Failed to create camera component
mmal: main: Failed to create camera component
mmal: Camera is not detected. Please check carefully the camera module is installed correctly

と表示されてしまう

接続方法については
http://www.raspberrypi.org/help/camera-module-setup/
の動画を参考にさせていただきました

raspberry pi カメラモジュール
で検索するともっとでるかも

接続できたらログインして

raspistill -o image.png

で撮影できる

ちなみに、このときに raspberry pi とディスプレイを
HDMI ケーブルでつないでおけば
画面にカメラの画像がでる
基本的には5秒プレビューしてから撮影だけど

-t オプションを指定してミリ秒単位で指定もできる

1秒は1000ミリ秒
なので1秒後とかなら

raspistill -o image.png -t 1000

とすればいい

プレビュー画面なんていらない
というなら
-n オプションをつけるとできるけど
この場合、画面が綺麗に写らないことがあるようなので注意

また解像度の指定もできる
デフォルトでは
2592 x 1944 ピクセル

これも
-w オプションで幅
-h オプションで高さ
を指定できる

1秒間のプレビューと、 640x 480 の画像で撮影するなら

raspistill -o image.png -t 1000 -w 640 -h 480

とすればいい

オプションはたくさんあるので

raspistill 

でオプションヘルプをみるとわかりやすい

なお、ディスプレイではなく
端末画面に表示するなら

sudo apt-get install fbi

で fbi をインストールし、これを使う

fbi -a image.jpg 

で実行

ただし、リモートではできず本体の場合のみできた

Androidでビデオ再生

Androidでビデオ再生

ビデオなどの動画再生は、VideoViewを使う

VideoViewは、MediaPlayerに似てるけど
こっちは、あらかじめレイアウトファイルへ組み込むことができる

まず、レイアウトファイルへ

<VideoView
android:id="@+id/video"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

そして、Javaで
VideoViewのインスタンスを取得し
動画のURIを設定してから
VideoView.start()で再生する

VideoView video = (VideoView)findViewById(R.id.video);

//res/raw/sampleを取得
video.setVideoUri(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.sample));

//動画の再生開始
video.start();

なお、VideoViewに設定できる動画は
ローカルファイルを直接指定するか
もしくは
ネットワークやリソースフォルダのファイルを指定することになる

ローカルファイルを設定するなら
VideoView.setVideoPath(String)
を使う

ネットワークやリソースフォルダを指定する場合は
Uriでパスを作成して
VideoView.setVideoUri(Uri)
で設定する

そして、設定してから
VideoView.start()で再生

MediaPlayerと違うのは、あらかじめ読み込む処理がいらないこと

ちなみに、再生の停止は
VideoView.pause()

再生位置を指定するなら
VideoView.seekTo(long)
を使う

音楽情報を通知領域へ表示

音楽情報を通知領域へ表示

通知領域へ音楽情報を表示するには
独自にNotificationのレイアウトを作成し
音楽の再生、停止、のタイミングでNotificationに設定する

ServiceへNotificationを設定
この処理のタイミングは
音声データの再生のタイミングにする

まず、Notificationの登録

startForeground(1, generateNotification());

generateNotification()の中身は以下のようになる

//通知領域タップ時のPendingIntent作成
Intent actionIntent = new Intent(getApplicationContext(), MainActivity.class);

PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0, actionIntent, PendingIntent.FLG_UPDATE_CURRENT);

//独自レイアウトのRemoteView作成
RemoteViews notificationView = new RemoteViews(getPackageName(), R.layout.status_bar);

//Notification生成
NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext());

//アイコン設定
builder.setSmallIcon(R.drawable.ic_start_media);

//独自レイアウトをNotificationへ設定
builder.setContent(notificationView);

//設定をtrueにして常時表示
builder.setOngoing(true);

//通知領域に初期表示のときの設定
builder.setTicker("sample title を設定");
builder.setContentIntent(pi);

//statusbar のアイコン設定
notificationView.setImageResource(R.id.imageIcon, R.drawable.ic_launcher);

//status barへタイトル設定
notificationView.setTextViewText(R.id.textTitle, "Sample title");

//status barへアーティスト名表示
notificationView.setTextViewText(R.id.textArtist, "Sample Artist");

//イメージアイコンボタンを押したときのIntentの設定
PendingIntent contentIntent   = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), Intent.FLAG_ACTIVITY_NEW_TASK);

notificationView.setOnClickPendingIntent(R.id.imageIcon, contentIntent);

//再生、一時停止を押したときのIntentの設定
notificationView.setOnClickPendingIntent(R.id.play, createPendingIntent("playpause"));

//次へボタンを押したときのIntent設定
notificationView.setOnClickPendingIntent(R.id.next, createPendingIntent("next"));

return builder.build();

サービスが終了すると
自動的にNotificationは終了するけど
明示的に通知領域から解除するには

stopForeground(true);

とする

startForeground()を使うと
Serviceは、システムから強制停止できなくなる

音楽の再生や動画再生みたいに長時間バックグラウンドで動作するサービスの場合
Notificationなどを使って通知領域へサービスの有無を表示するのが一般的

残念ながら、現時点では、表示領域からのアイコンによる操作は
標準ではサポートされてないため
Notificationの独自レイアウトを作成し
そこへ各機能のボタンなどを配置して
RemoteViews経由でIntentを設定していく

音楽情報をロックスクリーンへ表示する

音楽情報をロックスクリーンへ表示する

ロックスクリーンに音楽情報を表示するには
RemoteControlClient

LockScreenに表示する状態を設定し
AudioManagerクラスの
registerRemoteControlClient()
で登録すれば使える

まず LockScreenで押されたボタンのイベントを受け取るレシーバーのPendingIntentを生成

Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
mediaButtonIntent.setComponent(mComponentName);

PendingIntent mediaPendingIntent = PendingIntent.getBroadCast(getApplicationContext(), 0, mediaButtonIntent);

次に、RemoteControlClientを生成、PendingIntentを設定

remoteControlClient = new RemoteControlClient(mediaPendingIntent);
remoteControlClient.setTransportControlFlags(
  RemoteControlClient.FLAG_KEY_MEDIA_PLAY | 
  RemoteControlClient.FLAG_KEY_MEDIA_PAUSE |
  RemoteControlClient.FLAG_KEY_MEDIA_NEXT | 
  RemoteControlClient.FLAG_KEY_MEDIA_STOP
);

そして、RemoteControlClientの登録

mAudioManager.registerRemoteControlClient(remoteControlClient);

そして、AudioFocusの取得
mAudioManager.registerAudioFocus(new AudioFocusChangeListener(){

@Override
public void onAudioFocusChange(int focusChange){

Log.d(TAG,”Focus changed: ” + focusChange);
}
},
AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);
[/java]

次に、ロックスクリーンに表示する曲情報やボタン状態を設定

//ロックスクリーンの状態を再生に設定
remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING);

//ロックスクリーンに表示する音楽情報を設定
remoteControlClient
.editMetadata(true)
.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, "Sample Artist")
.putString(MediaMetadataRetriever.METADATA_KEY_ALBUM, "Sample Album")
.putString(MediaMetadataRetriever.METADATA_KEY_TITLE, "Sample Music")
.apply();

そして、この設定を解除するには
AudioManagerクラスの
unregisterRemoteControlClient()
で解除する

mAudioManager.unregisterRemoteControlClient(remoteControlClient);
remoteControlClient = null;

ロックスクリーンに曲情報を表示するときの注意点は
registerMediaButtonEventReceiver()
によるBroadCastReceiverの登録
そして
AudioFocusの取得
を行うこと

これをやらないと、表示されないので注意

また、ロックスクリーンのボタンの状態は
MediaPlayerの再生とは
自動では連動しないので
状態に合わせて、プログラム側で
RemoteControlClientクラスの
setPlaybackState()で値を設定する必要がある

音声の録音

音声の録音

Androidで音声の録音をするには
MediaRecorderを使う

これを使うことで録音や録画ができる

以下は初期化から録音まで

//MediaRecorder初期化
if(mMediaRecorder == null){
 mMediaRecorder = new MediaRecorder();
}

//入力をマイクへ設定
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

//保存フォーマットを3gpに設定
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

//Audioエンコードをデフォルトへ
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

//microSDへ名前を指定して保存
String fileName = "recorder.3gp";
mFilePath = Environment.getExternalStorageDirectory() + "/" +fileName;
mMediaRecorder.setOutputFile(mFilePath);

//録音準備完了なら録音開始
try{

mMediaRecorder.prepare();
}cash(Exception e){
 e.printStackTrace();
Log.e(TAG, e.toString(), e);
}

なお、録音停止は、MediaRecorder.stop()を使う

if(mMediaRecorder != null){

mMediaRecorder.stop();
mMediaRecorder.release();
}

また
録音機能には権限が必要になるため
AndroidManifest.xmlへ

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

が必要になる

また、microSDへの保存についても権限が必要になる

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

を追加する

MediaRecorderは、初期化設定して
MediaRecorder.prepare()を読んで準備し
MediaRecorder.start()で録音開始

初期化のときに音声なのか
映像なのかにより初期化方法は異なる

そして、録音のポイントは
オーディオソースの設定
オーディオ出力の設定になる

一般的な録音でいいけど
もし録音した音声が音割れするなら
MediaRecorder.setAudioSource()の引数へ
MediaRecorder.AudioSource.VOICE_RECOGNITION
を設定すると改善させることがある

音声の再生

音声の再生

MP3ファイルや、応答性の求められない音声データの再生は
android.mediaパッケージの
MediaPlayerクラスを使う

MediaPlayer.setDataSource()
で音声データを設定し

MediaPlayer.start()で再生する

ほとんどの場合、再生ボタンを押して再生になるので

implements OnClickListener, OnPreparedListener, OnCompletionListener

を追記する

そして、メンバ変数の宣言

private Button playPause;
private MediaPlayer mediaPlayer;

そして、onCreate()へ処理を追記する

playPause = (Button)findViewById(R.id.playpause);
playPause.setOnClickListener(this);
playPause.setEnabled(false);

//MediaPlayer 初期化
mediaPlayer = new MediaPlayer();

//再生準備完了の通知を受け取るリスナーの設定
mediaPlayer.setOnPreparedListener(this);

//再生完了の通知を受け取るリスナーの設定
mediaPlayer.setOnCompletionListener(this);

//再生させたい音声データのパス設定
String fileName = "android.resource://" + getPackageName() + "/" + R.raw.bgm;

try{

//音声データをMediaPlayerへ設定
mediaPlayer.setDataSource(this, Uri.parse(fileName));

//音声データを非同期で読み込む
mediaPlayer.prepareAsync();
setButtonText(mediaPlayer);

}catch(IllegalArgumentException e){
 e.printStackTrace();

}catch(SecurityException e){
e.printStackTrace();

}catch(IllegalStateException e){
e.printStackTrace();

}catch(IOException e){
 e.printStackTrace();
}

そして、アプリ終了のときの処理

@Override
public void onDestroy(){
super.onDestroy();

//再生中なら停止させる
if(mediaPlayer.isPlaying()){
 mediaPlayer.stop();
}

//MediaPlayerの解放
mediaPlayer.release();
}

メモリ操作みたいに解放が必要になる

そして、ボタンを押したら再生、停止する処理

@Override
public void onClick(View v){

if(v.getId() == R.id.playpause){
//再生中なら停止させる
if(mediaPlayer.isPlaying()){
 mediaPlayer.pause();
 setButtonText(mediaPlayer);
}
//再生中でないなら再生させる
else{
mediaPlayer.start();
setButtonText(mediaPlayer);
}
}
}

音楽データが再生可能になったときの処理

@Override
public void onPrepared(MediaPlayer mp){
playpause.setEnabled(true);
setButtonText(mp);
}

そして、音楽の再生終了したときにボタンの状態を変える処理

@Override
public void onCompletion(MediaPlayer mp){

setButtonText(mp);
}

ボタンの状態変化の処理
ここでは、表示されるラベルを変更する
ちなみに、これはユーザー関数

private void setButtonText(MediaPlayer mp){
//再生中なら停止へ
if(mp.playing()){
playpause.setText(getString(R.string.stop));

}
//停止中なら再生へ
else{
playpause.setText(getString(R.string.play));
}
}

MediaPlayerクラスは
内部で音楽情報を保持しているため
呼び出し側は、それを考慮して
start()
pause()
を呼び出さないとだめ

もし、呼び出してはならないほうを使うと
IllegalExceptionが発生する

今回は、MediaPlayerを初期化して

再生準備完了のpreparedと
再生完了の playbackCompletedの
状態を受け取るためのリスナーを設定し
これらが呼ばれるまで
ボタンのラベルを停止、再生と切り替えるようにしている

効果音の再生

効果音の再生

Androidの効果音の再生のときには
応答性が速く、短い音声データの再生になるので
android.mediaパッケージの
SoundPoolクラスを使う

res/rawsに音声データ配置して
SoundPool.load()
で読み込んで
SoundPool.play()
で再生する

大抵はタッチしたら音を鳴らすので

implements OnClickListener, OnLoadCompleteListener

を追加する

次に、メンバ変数の宣言

private SoundPool mSoundPool;
private int mSoundID;

あとは、onCreate()の中へ動作の追加をする
まずは、ボタンのインスタンスの取得

findViewById(R.id.button).setOnClickListener(this);
findViewById(R.id.button).setEnabled(false);

//SoundPool初期化
mSoundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);

//音声データの読み込み終了を検知するリスナーの設定
mSoundPool.setOnCompleteListener(this);

//音声データの読み込み開始
mSoundID = mSoundPool.load(this, R.raw.test, 1);

そして、画面破棄したときにSoundPoolを解放するので

@Override
public void onDestroy(){

super.onDestroy();
mSoundPool.release();
}

クリック時の処理も実装

@Override
public void onClick(View v){

if(v.getId() == R.id.button){
//音声の再生
mSoundPool.play(mSoundID, 1.0F, 1.0F, 0,0,1.0F);
}
}

そして、読み込み完了したときの処理を
onLoadComplete()へ実装

@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status){

//音声が読み込み完了したら再生ボタンを有効にする
findViewById(R.id.button).setEnabled(true);
}

最初は
setEnabled(false)でボタン無効化しておき
音声が再生できるようになってから
setEnabled(true)でボタンを押せるようにしている

SoundPool()
の初期化パラメーターは

第1引数は、再生されたSoundPoolで同時再生できる数
今回は1

第2引数は、音声の出力先
今回は、res/raws/でのデータを使ったけど
定数も使える
AudioManager.STREAM_ALERM
アラーム音

AudioManager.STREAM_NOTIFICATION
通知音

AudioManager.STREAM_DTMF
トーン信号音

AudioManager.STREAM_RING
着信音

AudioManager.STREAM_SYSTEM
システム音
となる

第3引数は、再生品質 デフォルトでは0になる

SoundPoolの初期化後、再生したい音楽データをメモリ上にロードする必要があるため
load()を使う

load()の引数は
第1引数は、Contextの設定

第2引数は、再生した音声のリソースID

第3引数は、再生品質を指定する
再生品質は、1が推奨となっている

今回なら
load(this, R.raw.test, 1)
となる

load()を実行すると、戻り値に
int型の soundIDが帰ってくる

soundID は、
読み込まれた音声データの番号なので
あとで再生するのに使う

再生については、自動では再生されないため
取得した soundIDを引数にして
play()で再生する

Raspberry Pi でWebカメラ

Raspberry Pi でWebカメラ

Raspberry Pi にはCSIコネクタにさす専用のコネクタもあるけど
USB接続の Webカメラも使える

UVC対応なら、ドライバをインストールしなくても
させば使える

今回、使った web カメラは
iBUFFALO マイク内蔵320万画素WEBカメラ F2.2ガラスレンズ搭載モデル シルバー BSW32KM03SV

raspberry pi は
Raspberry Pi Type B 512MB ケースセット Pi Tin for the Raspberry Pi – Clear

また電源確保のためセルフパワーのUSBハブを利用
iBUFFALO USB2.0ハブ セルフ&バスパワー 4ポート ACアダプタ付 ブラック 【PlayStation4,PS4 動作確認済】 パソコン/液晶TV[REGZA][AQUOS]対応 BSH4A01BK

まずは web カメラを USBにさす

次に

sudo tail -f /var/log/messages 


webカメラが使えるか調べる

今回のログは

Aug 13 10:49:38 raspberrypi kernel: [ 2511.592147] usb 1-1.3.3: Manufacturer: Etron Technology, Inc.
Aug 13 10:49:38 raspberrypi kernel: [ 2511.789941] media: Linux media interface: v0.10
Aug 13 10:49:38 raspberrypi kernel: [ 2511.819490] Linux video capture interface: v2.00
Aug 13 10:49:38 raspberrypi kernel: [ 2511.856057] uvcvideo: Found UVC 1.00 device BUFFALO BSW32KM03 USB PC Camera (2084:0d03)
Aug 13 10:49:38 raspberrypi kernel: [ 2511.863885] uvcvideo: UVC non compliance - GET_DEF(PROBE) not supported. Enabling workaround.
Aug 13 10:49:38 raspberrypi kernel: [ 2511.870234] input: BUFFALO BSW32KM03 USB PC Camera as /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3.3/1-1.3.3:1.0/input/input2
Aug 13 10:49:38 raspberrypi kernel: [ 2511.874302] usbcore: registered new interface driver uvcvideo
Aug 13 10:49:38 raspberrypi kernel: [ 2511.874336] USB Video Class driver (1.1.1)
Aug 13 10:49:38 raspberrypi kernel: [ 2512.005222] usb_audio: Warning! Unlikely big volume range (=4096), cval->res is probably wrong.
Aug 13 10:49:38 raspberrypi kernel: [ 2512.005260] usb_audio: [3] FU [Mic Capture Volume] ch = 1, val = -4097/-1/1<6>[ 2512.012606] usbcore: registered new interface driver snd-usb-audio

今回の確認項目は

Aug 13 10:49:38 raspberrypi kernel: [ 2511.856057] uvcvideo: Found UVC 1.00 device BUFFALO BSW32KM03 USB PC Camera (2084:0d03)

これが
USBカメラの型番

Aug 13 10:49:38 raspberrypi kernel: [ 2511.874302] usbcore: registered new interface driver uvcvideo

これが
ドライバ uvcvideo が読み込まれたことを示す

Aug 13 10:49:38 raspberrypi kernel: [ 2512.005260] usb_audio: [3] FU [Mic Capture Volume] ch = 1, val = -4097/-1/1<6>[ 2512.012606] usbcore: registered new interface driver snd-usb-audio

これが
サウンドドライバ snd-usb-audio 
が読み込まれたことを示す

次に表示の確認や画質コントロールソフトをインストール

sudo apt-get install uvccapture uvcdynctrl guvcview 

これで本体をディスプレイにつなげればデスクトップ環境で使うことができる

次に
Raspberry Pi 単体で動画配信できるようにする

ホームサーバーなどではこっちを使う

これには MJPG-streamer をつかう

これを使えば、パソコンやスマホブラウザで
Raspberry PI にアクセスすることで使うことができる

ただし MJPG-streamer をインストールするのに
apt-get ではできないので
Subversion をつかう

sudo apt-get install subversion libjpeg-dev imagemagick

次に MJPEG-stremer のソースをsuvbersion でダウンロード

svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer

そして、コンパイル

cd mjpg-streamer/
make
sudo make install

これでインストール完了

次に MJPEG-streamer の起動

これはスクリプトファイルを作成して実行する

320 x 249 ピクセルの動画を
10fps
これは1秒間に10コマの間隔で配信し
ブラウザはIDとパスワードでアクセスする

今回は ID test パスワード 1234 にする

sudo vim stream.sh

でファイルを作成

#!/bin/bash
PORT="8080"
ID="test"
PW="1234"
SIZE="320x240"
FRAMERATE="10"

export LD_LIBRARY_PATH=/usr/local/lib
mjpg_streamer \
        -i "input_uvc.so -f $FRAMERATE -r $SIZE -d /dev/video0 -y" \
        -o "output_http.so -w /usr/local/www -p $PORT -c $ID:$PW"

そして

chmod 755 stream.sh 

で権限変更

これで
./stream.sh
で実行し
ブラウザで
http://192.168.1.198:8080
でアクセス

ユーザ名 test
パスワード 1234
でアクセスはできたけど
なぜか画像が砂嵐状態

検索して
http://homebrew.jp/show?page=1445
を参考に

sudo ./mjpg_streamer -i "./input_uvc.so -f 15 -r 640x480 -d /dev/video0" -o "./output_http.so -w ./www -p 8080" 

を実行したら動いたので修正

これで再度

./stream.sh 

を実行すれば webカメラの画像が表示される

Raspberry Pi で外付けHDD

Raspberry Pi で外付けHDD

Raspberry Pi をDLNAサーバや
samba をインストールしてNASを構築したときに
SDカードでは容量が少なすぎる

このため Raspberry Pi へ外付けHDDを接続して使う

なお、WiFi アダプタ同様、直接 Raspberry Pi にさすと電力供給の問題で不安定になるので
セルフパワー形式のUSBハブに接続すること

今回使ったのは
MARSHAL(マーシャル) 【160GB】 【USB3.0&USB2.0両対応】外付けポータブルHDD(2.5インチ外付けハードディスクドライブ 160GB MARSHAL WEB限定モデル)

iBUFFALO USB2.0ハブ セルフ&バスパワー 4ポート ACアダプタ付 ブラック 【PlayStation4,PS4 動作確認済】 パソコン/液晶TV[REGZA][AQUOS]対応 BSH4A01BK

本体については
Raspberry Pi Type B 512MB ケースセット Pi Tin for the Raspberry Pi – Clear

を使用

まずはUSBでHDDを接続したときに自動マウントするために

sudo apt-get install usbmount 

で usbmount をインストール

次にマウントするけど
書籍では FAT32 形式フォーマットだけど
購入した外付けHDDはNTFS形式

なので
http://frogcodeworks.com/raspberrypi-hdd-format/
を参考に

sudo apt-get install ntfs-3g


ntfsマウントができるようにする

次に、usbmount の設定ファイルを編集

sudo vim /etc/usbmount/usbmount.conf 


49行めの

FS_MOUNTOPTIONS=""

FS_MOUNTOPTIONS="-fstype=ntfs,uid=pi,gid=pi,iocharset=utf8,codepage=932"

にする

次に、sambaインストール

sudo apt-get install samba samba-common samba-common-bin

次に samba 設定ファイルを編集する

 sudo vim /etc/samba/smb.conf 

そして 33行めの
[global]

の下に

dos charset = CP932
 35 unix charset = UTF8

を追記し
ファイルの末尾に

[share]
path = /media/usb0
valid users =pi
writable = yes
geust = no
guest only = no
create mode = 0777
directory mode = 0777

を追記して保存

そしてsambaのためのユーザとパスワードを設定

sudo smbpasswd -a pi
sudo /etc/init.d//samba restart

で samba を再起動

これでできると思ったけど、どうやらマウントしていない

df -h

で確認しても外付けHDDは認識していない

sudo fdisk -l

では
外付けHDDを認識している

また

dmesg | less | grep sda

では

[    7.833857] sd 0:0:0:0: [sda] 312580096 512-byte logical blocks: (160 GB/149 GiB)

というように認識している

http://mobilenikki.cocolog-nifty.com/wzero3/2013/07/raspberry-pisam.html
を参考に
マウントする方法を実行

sudo mkdir /mnt/share
sudo mount -t ntfs-3g /dev/sda1 /mnt/share

でマウント

これで接続できるはずなので
まずは Ubuntu でアクセス

Nautilus で ネットワークの内容を表示
でRASBERRYPI と表示されているので
これをクリックすれば
共有ファイルへアクセスするために
ユーザ名
パスワードを聞かれるので
入力すればアクセスできる

ただし
これだと毎回コマンドを打つ必要があり面倒
なので
http://raspberrypi.blog.fc2.com/blog-entry-51.html
を参考に

sudo vim /etc/fstab

で最終行に

/dev/sda1 /mnt/share  ntfs-3g defaults 0 0

を追加

また、現在は中身は見れるけど
書き込みや新規作成ができないので
[share]
path = /media/usb0
valid users =pi
writable = yes
geust = no
guest only = no
create mode = 0777
directory mode = 0777
[/shell]
を変更

[RaspNAS]
comment=USBHDD
path=/mnt/share
public = Yes
read only = No
writable = Yes
guest ok = Yes
force user = pi

と変更して保存

これでようやく書き込みやファイル作成が可能になりました

GMOクラウドのネットワーク再構築

GMOクラウドのネットワーク再構築

wordpress の投稿を行おうとしたところ
データベース接続確立エラー
となり接続できなくなったため

以前対処したように、
クラウドコンソールからログインし状態を確認

ダッシュボードから仮想マシンの状態を確認したところ
Pending のままになっていた

このため
仮想サーバー > 使用しているマシンのラベル名をクリック

そして、アクションの項目にある
ネットワークの再構築をクリックしOK
をおすとネットワークの再構築が始まる

しばらく待つと、状態が Pending のままから
complete になるので
これで再度接続すると問題は解決さえた

メンテの後などにたまにあるので
もし wordpress に接続できなくなったり
SSHでの接続もできなくなった場合
一度クラウドコンソールで状態が Pending のままになっていないか調べるようにすると解決するヒントが得られる