ネットワークとコンピュータ制御
実技指導資料
Ⅰ.ネットワーク技術
Ⅱ.コンピュータ制御
Ⅲ.情 報 技 術 実 習
滋賀県立彦根工業高等学校 情報技術科
ネットワークとコンピュータ制御を中心とした学習
1年生
2
年
生
3
ネットワーク技術
生
コンピュータ制御
※
※
カ
ウ
ン
ト
処
理
(
ラ
ー
メ
ン
タ
イ
マ
)
D
C
モ
ー
タ
の
制
御
と
回
路
D
C
モ
ー
タ
の
速
度
制
御
パ
ル
ス
の
作
成
と
サ
ー
ボ
モ
ー
タ
外
部
入
力
に
よ
る
サ
ー
ボ
モ
ー
タ
制
御
サ
ー
ボ
モ
ー
タ
の
モ
ー
シ
ョ
ン
サ
ー
ボ
モ
ー
タ
の
シ
ナ
リ
オ
複
数
サ
ー
ボ
モ
ー
タ
の
制
御
2
軸
ロ
ボ
ッ
ト
の
制
御
X
P
o
r
t
に
よ
る
遠
隔
制
御
X
p
o
r
t
→
※
コ
ン
ピ
ュ
ー
(
座タ
学制
)御
の
基
礎
※
R
S
A
暗
号
通
信
プ
ロ
グ
ラ
ム
※
※
H
T
T
P
ク
ラ
イ
ア
ン
ト
プ
ロ
グ
ラ
ム
※
※
S
N
T
P
ク
ラ
イ
ア
ン
ト
プ
ロ
グ
ラ
ム
※
※
C
言
語
で
の
チ
ャ
ッ
ト
プ
ロ
グ
ラ
ム
※
※
V
B
で
の
チ
ャ
ッ
ト
プ
ロ
グ
ラ
ム
※
※
ネ
ッ
ト
ワ
ー
ク
ア
ナ
ラ
イ
ザ
の
活
用
※
※
ネ
ッ
ト
ワ
ー
ク
関
連
コ
マ
ン
ド
※
※
P
I
C
連
携
情報技術実習
ポ
画ケ
面コ
表ン
示に
とよ
制る
御
VisualBasicによる制御
VisualBasicによる
画面表示と制御
※PIC制御
ボードの製作
※ PIC に よ
る入出力制御
※
ポ
ケ
コ
入ン
出に
力よ
制る
御
※
※
※
※
外
部
入
出
力
ボ
ー
ド
製
作
パソコンでのUSB-I/O制御
※
ネットを介した
ジャンケンゲーム
※
ハ
ー
ド
ウ
ェ
ア
の
基
礎
実
習
※
※
コ
ン
ピ
ュ
ー
タ
の
基
礎
学
習
ネ
ッ
ト
ワ
(
座ー
学ク
)の
基
礎
年
P
I
C
に
よ
る
D
C
モ
ー
タ
制
御
2
足
歩
行
ロ
ボ
ッ
ト
の
制
御
ロ
ボ
ッ
ト
の
遠
隔
制
御
(
C
#
)
VB/C/などを使用したソフトウェア実習 ・ データベース/コンピュータグラフィックなどのアプリ実習
課題研究
H19年度
・VisualBasic・Direct x・C++等
野球ゲーム おとあそび モノポリー
アクションRPG カードゲーム(花札)
シューティングゲーム
・Shadeを使ったCG・CGアニメ-ション
五重の塔
ヨット帆走 CGアニメ
・2足歩行ロボットの制御
遠隔地ロボット制御
階段の昇降
RoBo-ONE用ロボット制御
・PICを使ってハードウェアの制御
イルミネーション
デジタル時計
回転表示灯
・JAVAでのプログラム
iアプリによるゲーム作成
※ 印は、この冊子に記載して
ある項目です
Ⅰ ネットワーク技術
1.ネットワークの状態確認
1)ネットワーク関連のコマンド
2)ネットワークアナライザの活用
2.VisualBasic6プログラム
3)チャットプログラム
3.Cプログラム
4)チャットプログラム
5)SNTPクライアントプログラム
6)HTTPクライアントプログラム
7)RSA暗号通信プログラム
夏期講習
8)ネットワークサーバ構築
1)ネットワーク関連のコマンドを使った学習
ネットワーク設定・プロトコルとその利用について実際の動きをコマンドを用いて確認する。
・基本的なネットワーク設定の確認
コマンド:
ipconfig /all
C:\>ipconfig /all
Windows 2000 IP Configuration
Host Name . . . . . . . . . . . . : IT03
Primary DNS Suffix . . . . . . . : GENKO
Node Type . . . . . . . . . . . . : Broadcast
IP Routing Enabled. . . . . . . . : No
WINS Proxy Enabled. . . . . . . . : No
DNS Suffix Search List. . . . . . : GENKO
Ethernet adapter ローカル エリア接続:
Connection-specific DNS Suffix
. :
Description . . . . . . . . . . . : Intel(R) PRO/100 VM Desktop Adapter
Physical Address. . . . . . . . . : 00-E0-18-44-6F-39
DHCP Enabled. . . . . . . . . . . : No
IP Address. . . . . . . . . . . . : 192.168.1.83
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.1.254
DNS Servers . . . . . . . . . . . : 192.168.1.231
確認事項:
192.168.254.231
IPアドレス・サブネットマスク・デフォルトゲートウェイ
MACアドレス・インタフェース・利用中のDNSサーバ
・ネットワーク接続の確認
コマンド: ping 相手IPアドレス
確認事項: ネットワークの疎通
・使用ポートの確認
コマンド:
netstat /a
確認事項:
現在利用中のポート番号
・ネットワーク経路の確認
コマンド:
tracert相手IPアドレス
確認事項:
通信相手までの経路・中継機器
・DNS応答の確認
コマンド:
nslookup URL
確認事項:
DNSの提供するサービス内容
Ⅰ-1
2)ネットワークアナライザの活用
通信されている内容や状態の把握のため、ネットワークアナライザソフトを用いて確認する。
使用ソフトウェア:
Wireshark
・
WinPcap
Wireshrk はフリーで提供されており、WinPcap はインストーラに同梱されている。Ethereal の
後継ソフト。授業で使用する場合、管理者以外の権限では利用できないケースもあるので、イン
ストール時のオプションとインストール後の起動確認は十分に行う必要がある。
・キャプチャ方法
Wireshark を起動し、上部メニューの Capture - Interface を選択。
現れたウィンドウの使用中インタフェース(IP アドレスで確認)の Start ボタンをクリック。
確認したい作業を行った後、ツールバー左から4番目の Stop ボタンか、パケット監視ウィンドウ
右下の Stop ボタンを押す。
・通信内容の確認
キャプチャが完了すると次のような画面になる。
パケットが多すぎて目標が探しにくい場合、Filter ボックスにプロトコルを記入し Apply を押す
ことで、そのプロトコルだけを表示することができる。
Ⅰ-2
3)VisualBasic6 でのチャットプログラム
VisualBasic6 の Winsock コントロールを使って簡単に通信プログラムを作成し、通信プログラ
ムに必要な知識の習得とプロトコルの確認をおこなう。
使用プロトコル
:
UDP
・Winsock コントロールの準備
通常 Winsock コンポーネントはツールボックスには無いので、これを追加する。
フォーム作成状態にしてから、プロジェクト
→
コンポーネント
を選択。
コンポーネント選択ダイアログが開くので、「Microsoft Winsock Control」にチェックを入れ、
追加する。この作業も管理者権限が必要になる場合があるが、管理者で一度追加作業を行ってお
くと制限ユーザでも問題なく行える。
・フォームの作成
各コントロールを貼り付ける。
テキストボックス
受信メッセージエリア
送信メッセージエリア
送信先入力エリア
ボタン
送信ボタン
Winsock コントロール
Ⅰ-3
・プロパティの設定
受信メッセージエリアに使用するテキストボックスの MultiLine を True に設定する。
各テキストボックスの Text は任意に設定して構わない。
・プログラムの作成
Form_Load 処理
Winsock コントロールのプロパティを変更し、ポートをバインドする。
プロパティ設定は先に行っておいても問題はない。
Private Sub Form_Load()
Winsock1.Protocol = sckUDPProtocol
Winsock1.LocalPort = 50000
Winsock1.Bind 50000
End Sub
コマンドボタン処理
送信に関する処理を記述する。
相手 IP アドレスを RemoteHost に、相手ポート番号を RemotePort に設定した後に、
SendData メソッドを使って送信する。
Private Sub Command1_Click()
Winsock1.RemoteHost = Text2.Text
Winsock1.RemotePort = 50000
Winsock1.SendData Text3.Text
End Sub
受信イベント処理
受信時に発生するイベント Winsock1_DataArrival に受信データ表示処理を記述する。
GetData メソッドで受信データを変数に格納し、テキストボックスに表示している。
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim rcv As String
Winsock1.GetData rcv
Text1.Text = Text1.Text + Winsock1.RemoteHostIP _
+ ":" + rcv + Chr$(13) + Chr$(10)
End Sub
最初は Text1.Text=rcv としてプログラムを実行し動作を確認させる。
受信データは最新の1件だけが表示され、送信相手も表示されないことに問題
を感じさせ、それを解消する手段として上記プログラムへと変更を行う。
また、改行コードについても説明し、Chr$(13)+Chr$(10)が「CR+LF」となるこ
とを実際のプログラムで理解させる。
Ⅰ-4
4)C でのチャットプログラム
VisualBasic の Winsock では文字列が主な送受信の方式となり、自由な送受信データの作成が
難しい。今後のプログラム開発に対し柔軟に対応できる C 言語でも同様のプログラム作成を行い、
プログラム言語を選ばない柔軟な対応力と理解の充実を図る。
使用プロトコル:
UDP
同時に送受信をサポートするプログラムは複雑になるため、Windows の利点を生かして、送信・
受信を別のプログラムとし、同時に実行することで対応する。
・送信プログラムの作成
このプログラム単体では動作確認ができないため、次項の受信プログラムを全員に見える場所
で実行しておき、対象となる IP アドレスを公開しておく。
#include <stdio.h>
#include <winsock2.h>
int main( void ){
WSADATA
wsaData;
SOCKET
s;
SOCKADDR_IN
toaddr;
char
send_str[80],ip[20];
int
ret;
ret = WSAStartup( MAKEWORD(1,1), &wsaData );
if( ret != 0 ) return 1;
s = socket( AF_INET, SOCK_DGRAM, 0 );
// SOCK_STREAM:TCP SOCK_DGRAM:UDP
if( s == INVALID_SOCKET ){
printf(" Error ** socket open ** \n");
WSACleanup();
return 2;
}
while( 1 ){
// 宛先・送信データの作成
printf("宛先 IP アドレス:");
gets(ip);
memset( &toaddr, 0, sizeof(toaddr) );
toaddr.sin_family = AF_INET;
//アドレスファミリはインターネット
toaddr.sin_port = htons(50001); //ポート番号
toaddr.sin_addr.s_addr = inet_addr(ip); //接続先 IP アドレス
memset( send_str, 0, sizeof(send_str) );
printf("送信文字列:");
gets(send_str);
次頁へ続く
Ⅰ-5
前頁からの続き
// パケットの送信
ret = sendto( s, (const char *)send_str, strlen(send_str)+1, 0,
(SOCKADDR *)&toaddr, sizeof(toaddr) );
if( ret == SOCKET_ERROR ){
printf(" Error ** send packet **\n");
closesocket(s);
WSACleanup();
return 4;
}
}
closesocket(s);
WSACleanup();
printf("プログラム正常終了\n");
return 0;
}
・受信プログラムの作成
先に作成した送信プログラムと同時に実行して動作確認を行い、早く出来た生徒には一斉送信
(ブロードキャストアドレスの使用)や登録 IP からのみ表示するよう改良を加えさせる。
#include <stdio.h>
#include <winsock2.h>
int main( void ){
WSADATA
wsaData;
SOCKET
s;
SOCKADDR_IN
myaddr,fromaddr;
char
recv_str[80];
int
ret, fromlen;
ret = WSAStartup( MAKEWORD(1,1), &wsaData );
if( ret != 0 ) return 1;
s = socket( AF_INET, SOCK_DGRAM, 0 );
// SOCK_STREAM:TCP SOCK_DGRAM:UDP
if( s == INVALID_SOCKET ){
printf(" Error ** socket open ** \n");
WSACleanup();
return 2;
}
次頁へ続く
Ⅰ-6
前頁からの続き
memset( &myaddr, 0, sizeof(myaddr) );
myaddr.sin_family = AF_INET;
//待ち受け Socket の作成
//アドレスファミリはインターネット
myaddr.sin_port = htons(50001);
//ポート番号(適当)
myaddr.sin_addr.s_addr = INADDR_ANY;
//接続元アドレス(誰でも受ける)
ret = bind( s, (SOCKADDR *)&myaddr, sizeof(myaddr) );
//待ち受けの作成
if( ret != 0 ){
printf(" Error ** bind **\n");
closesocket(s);
WSACleanup();
return 3;
}
// パケットの受信
printf("Data 受信中\n");
while(1){
fromlen = (int)sizeof( fromaddr );
ret = recvfrom( s, recv_str, (int)sizeof(recv_str)-1, 0,
(SOCKADDR *)&fromaddr, &fromlen );
if( ret == SOCKET_ERROR ){
printf(" Error ** recv packet **\n");
closesocket(s);
WSACleanup();
return 5;
}
recv_str[ret] = '\0';
printf("%s>%s\n",inet_ntoa(fromaddr.sin_addr),recv_str);
}
closesocket(s);
WSACleanup();
printf("プログラム正常終了\n");
return 0;
}
Ⅰ-7
5)SNTP クライアントプログラム
UDP 通信の応用として、SNTP サーバから日時を受信して表示するプログラムを作成する。
UDP での送受信を兼ね備えたプログラムを作成するとともに、SNTP やクライアントプログラムに
必要な知識を身につける。
#include <stdio.h>
#include <winsock2.h>
#include <time.h>
int main( void ){
WSADATA
wsaData;
SOCKET
s;
SOCKADDR_IN
myaddr, serveraddr;
time_t
server_time;
struct tm
*timep;
int
ret, sock_size;
struct SNTP_packet_data {
// SNTP で決められているデータを構造体に
int
control_word;
// コントロールワード
int
root_delay;
int
root_dispersion;
int
identifier;
__int64 reference_timestamp;
__int64 originate_timestamp;
__int64 receive_timestamp;
int
transmit_timestamp_seconds;
//↑ここに 1900 年 1 月 1 日からの秒数が格納される
int
transmit_timestamp_fractions;
} sntp_packet;
ret = WSAStartup( MAKEWORD(1,1), &wsaData );
if( ret != 0 ) return 1;
s = socket( AF_INET, SOCK_DGRAM, 0 );
// SOCK_STREAM:TCP SOCK_DGRAM:UDP
if( s == INVALID_SOCKET ){
printf(" Error ** socket open ** \n");
WSACleanup();
return 2;
}
memset( &myaddr, 0, sizeof(myaddr) );
myaddr.sin_family = AF_INET;
//待ち受け Socket の作成
//アドレスファミリはインターネット
myaddr.sin_port = htons(50001);
//ポート番号(適当)
myaddr.sin_addr.s_addr = INADDR_ANY;
//接続元アドレス(誰でも受ける)
ret = bind( s, (SOCKADDR *)&myaddr, sizeof(myaddr) ); //待ち受けの作成
if( ret != 0 ){
printf(" Error ** bind **\n");
closesocket(s);
WSACleanup();
次頁へ続く
Ⅰ-8
前頁からの続き
return 3;
}
memset( &serveraddr, 0, sizeof(serveraddr) );
serveraddr.sin_family = AF_INET;
//アドレスファミリはインターネット
serveraddr.sin_port = htons(123);
//ポート番号(NTP は 123 番)
serveraddr.sin_addr.s_addr = inet_addr("192.168.1.1"); //サーバ IP アドレス
// 送信データの作成
memset( &sntp_packet, 0, sizeof(sntp_packet) ); //とりあえず全部 0 でクリア
sntp_packet.control_word = htonl( 0x1B000000 ); //現在時刻リクエスト
// パケットの送信
ret = sendto( s, (const char *)&sntp_packet, sizeof(sntp_packet), 0,
(SOCKADDR *)&serveraddr, sizeof(serveraddr) );
if( ret == SOCKET_ERROR ){
printf(" Error ** send packet **\n");
closesocket(s);
WSACleanup();
return 4;
}
// パケットの受信
sock_size = sizeof( SOCKADDR_IN );
ret = recvfrom( s, (char *)&sntp_packet, sizeof(sntp_packet), 0,
(SOCKADDR *)&serveraddr, &sock_size );
if( ret == SOCKET_ERROR ){
printf(" Error ** recv packet **\n");
closesocket(s);
WSACleanup();
return 5;
}
/* 取得した時刻を変換
SNTP サーバの返答 : transmit_timestamp_seconds に 1900 年 1 月 1 日からの秒数が格納
gmtime 関数の基準 : 1970 年 1 月 1 日
[その差 2208988800 秒] */
server_time = ntohl( sntp_packet.transmit_timestamp_seconds ) - 2208988800;
timep = gmtime( &server_time );
printf(" Year
: %d\n", timep->tm_year + 1900 ); //年は 1900 年より
printf(" Month
: %d\n", timep->tm_mon+1 ); //月の値は 0 から 11 なので+1
printf(" Day
: %d\n", timep->tm_mday );
printf(" Hour
: %d\n", timep->tm_hour + 9 ); // UTC→JST
printf(" Minute : %d\n", timep->tm_min );
printf(" Second : %d\n", timep->tm_sec );
closesocket(s);
WSACleanup();
printf("プログラム正常終了\n");
return 0;
}
Ⅰ-9
6)HTTP クライアントプログラム
SNTP 以外のクライアントプログラムとして HTTP クライアントを作成し、サービスによるクラ
イアントの違いを学習するとともに、TCP 通信についても学習を行う。
#include <stdio.h>
#include <winsock2.h>
int main( void ){
char
s_name[]="svi1.genko"; //サーバー名
char
s_port[8]="80"; //ポート番号
char
s_url[]="http://www.svi1.genko/index.html"; //サーバーURL
char
s_rcv[1024]; //受信データ格納用変数
char
str[256]; //送信データ作成用変数
int
ret; //関数戻り値格納用変数
WSADATA
wsaData;
u_short
port=80;
SOCKET
s;
LPHOSTENT
lphost;
SOCKADDR_IN
sockadd;
// ---------------------------------------------------- WinSock の初期化
ret = WSAStartup( MAKEWORD(1,1), &wsaData);
if( ret != 0 ){
printf(" Error *** WinSock 初期化失敗 ***\n");
return 1;
}
// ---------------------------------------------------- Socket の Open
printf(" ServerName --- %s\n",s_name);
printf(" ServerPort --- %s\n",s_port);
printf(" ServerURL
--- %s\n",s_url);
s = socket( AF_INET, SOCK_STREAM, 0);
if( s == INVALID_SOCKET ){
printf(" Error *** Socket を Open できません ***\n");
WSACleanup();
return 3;
}
// ---------------------------------------------------- Server の確認(名前解決)
lphost = gethostbyname(s_name);
if( lphost == NULL ){
printf(" Error *** Server が見つかりません ***\n");
WSACleanup();
return 4;
}
次頁へ続く
Ⅰ-10
前頁からの続き
// ---------------------------------------------------- Server へ接続
memset( &sockadd, 0, sizeof(sockadd) );
sockadd.sin_family = AF_INET;
sockadd.sin_port = htons(port);
sockadd.sin_addr = *((LPIN_ADDR)*lphost->h_addr_list);
if( connect( s, (PSOCKADDR)&sockadd, sizeof(sockadd) ) != 0 ){ //接続
printf(" Error *** サーバに接続失敗 ***\n");
closesocket(s);
WSACleanup();
return 5;
}
// ---------------------------------------------------- データの送受信
sprintf( str, "GET %s HTTP/1.0\n\n",s_url );
ret = send( s, str, (int)strlen(str), 0 ); //GET リクエスト送信
printf(" *** 受信開始 ***\n");
do{
memset(s_rcv, '\0', sizeof(s_rcv) );
ret = recv( s, s_rcv, (int)sizeof(s_rcv)-1, 0 ); //データの受信
printf("%s", s_rcv);
if( ret == SOCKET_ERROR ){
printf(" Error *** 受信でエラー発生 ***\n");
ret = 0;
}
}while( ret ); //データが無くなるまで受信を繰り返す
printf(" *** 受信終了 ***\n");
// ---------------------------------------------------- Shutdown & Close
if( shutdown( s, SD_BOTH ) != 0 )
//シャットダウン処理
printf(" Error *** シャットダウンに失敗しました ***\n");
closesocket(s); //ソケットのクローズ
// ---------------------------------------------------- WinSock の開放
ret = WSACleanup();
if( ret == SOCKET_ERROR ){
printf(" Error *** WinSock 開放失敗 ***\n");
return 2;
}
printf(" *** 正常終了しました ***\n");
return 0;
}
Ⅰ-11
7)RSA 暗号通信プログラム
これまでに作成したプログラムでの通信パケットをネットワークアナライザを使って確認し、
通信内容が簡単に傍受できることや暗号化の必要性について考えさせ、代表的な公開鍵暗号方式
である RSA 暗号をプログラムによって学習する。
・RSA 暗号通信の準備
基本的な RSA 暗号の仕組みを理解しプログラム作成へと発展するために、簡単な数字で公開鍵、
秘密鍵、法を求める。秘密鍵の生成には「拡張されたユークリッドの互除法」を用いる方法が一
般的だが、説明にかかる時間を考えて次の流れ図によるプログラムで求めた。
公開鍵・秘密鍵・法を求める手順
秘密鍵作成
start
①
相違となる素数P・Qを選ぶ。
②
法となる数字を計算する。法N=P*Q
③
(P-1)*(Q-1)を計算しmとする。
④
1<e<Nとなるeを選ぶ。
変数宣言
ただし、
(P-1)*(Q-1)とは互いに素となる。
d=1
(P-1)*(Q-1)の約数でない素数を選べばよい。
公開鍵e
⑤
公開鍵e、法Nを公開する。
⑥
ed≡1(mod
m)の条件を満たす整数d(0<d<m)を
秘密鍵作成プログラム、もしくはユークリッドの互除法で求める。
(P-1)*(Q-1)
のm
プログラム例
#include <stdio.h>
d<m
int main( void ){
int e,m,d=1;
(e*d)%m=1
printf("公開鍵 e を入力:");
Y
scanf("%d",&e);
printf("(P-1)*(Q-1)の値を入力:");
N
scanf("%d",&m);
d
while( d<m ){
d++
if( (e*d)%m == 1 ){
printf("秘密鍵 d は%d\n",d);
return 0;
}
d++;
}
printf("秘密鍵作成に失敗");
Error
return -1;
}
end
Ⅰ-12
・暗号通信プログラムの作成
通信プログラムの中にRSA暗号プログラムを組み込み、暗号化しながらの通信を行う。
プログラム作成進度に差が出ることが予測されるので、最初は 1 文字、完成した人から文字列の
暗号通信へと発展させる。時間にゆとりのある場合、通信を行わない暗号化・復号化のみのプロ
グラムで動作を確認し、文字列の暗号化・復号を学習しておくことで進度の差を少なく出来る。
暗号化
復号
start
start
変数宣言
変数宣言
累乗の余り計算
公開鍵 e
秘密鍵 d
法 n
法 n
pow _mod
(m,e,n)
変数宣言
a=1
平文のコードm
暗号コード c
c=
pow_mod
(m,e,n)
m=
pow_mod
(c,d,n)
暗号c
復号化した
コード m
end
end
e=1
i
1,e,1
a=(a*m)%n
i
「累乗の余り計算」プログラム例
int pow_mod(int m,int e,int n){
int i,a=1;
return a
if( e!=1 ){
for( i=1;i<=e;i++ )
a=(a*m)%n;
}
return a;
}
Ⅰ-13
夏期講習
ネットワークサーバ構築
実際に稼動しているサーバと同等の環境を構築することで、インターネットを中心とするネッ
トワーク技術をより身近なものとし、ネットワークサービスについての理解を図る。
学習内容
Linux のインストール
FTP サーバ
Web サーバ
DNS による独自ドメイン
各サーバの構築・設定と
サービスを受けるクライアントの設定
メールサーバ
使用機材
受講者1人に対し サーバ用 PC1台、クライアント用 PC1台。
サーバ用 PC は既存の OS を削除し新規インストールを行えるもの。
クライアント用 PC はインストール・設定変更を行うため管理者権限が与えられるもの。
使用する全サーバと全クライアントを接続するための、ハブと LAN ケーブル。
Linux インストールメディア(CD・DVD)サーバ台数分。
短時間での学習を目標としたことと機材の関係から、平成 18 年度は希望者に対する夏期講習とし
て実施した。実施に対しては教材の作成・指導にSEの協力を頂き、3 日間半日ずつの日程で計
10 時間程度の講習となった。授業での学習が講習内容まで進んでいないため、講習の内容は主に
講習資料にしたがって次々と設定を行ってゆく体験的なものとなったが、後日サービスに対する
学習を行った時に理解度・学習意欲に大きな差が出たことから、効果の高い学習であると言える。
しかし、SE に対する負担が大きなことから継続的な実施は難しく、平成 19 年度には教員のみの
指導で同じ講習を行った。使用機材の変更に伴う講習資料の手直しと、講習を担当する教員が事
前に一通りの作業を試すことで、特に問題なく講習を実施することが出来た。
Ⅰ-14
仮想マシンの活用
Windows 用 PC に Linux をインストールする場合、チップセットやビデオカードによって正常に
認識や起動ができない事がある。その場合ディストリビューションを変更する必要が出てくるが、
ディストリビューションを変更すると収録されているソフトウェアが変わり、資料を大幅に手直
しする必要がある。確認や修正にかかる負担を軽減するには仮想マシンを用いる方法がある。
仮想マシンでの講習を、無償で提供されている VMware Player で検証した。
VMware Player について
x86 および x64 プロセッサを搭載するコンピュータで動作する仮想マシン環境ソフトウェア。
対応するホスト OS は Windows と Linux。他の VMware で作成された仮想マシンを実行するソフト
ウェア。新たな仮想マシンを構築する機能は持たない。
有償製品では新たな仮想マシンを作成する機能を有するものもあるが、今回は幅広く活用できる
よう無償製品での利用を重視し、仮想マシンの新規作成には別のフリーソフトを利用した。
以下に QEMU というフリーソフトと VMwarePlayer を使った構築方法を紹介する。
・ダウンロードした VMwarePlayer のインストーラを管理者で実行しインストール。
・コマンドプロンプトで QEMU を解凍したフォルダへ移動し、qemu-img.exe を使って仮想
HDD を作成。 fedora5.vmdk はファイル名、4G は容量。
> qemu-img create -f vmdk c:\fedora5.vmdk 4G
・テキストエディタで次の設定ファイルを作成し、拡張子を vmx として仮想 HDD と同一の
フォルダに保存する。
config.version = "8"
virtualHW.version = "4"
scsi0.present = "TRUE"
memsize = "256"
メモリサイズは実メモリより少なめに設定。
ide0:0.present = "TRUE"
ide0:0.fileName = "fedora5.vmdk"
仮想 HDD ファイル名を設定。
ide1:0.present = "TRUE"
ide1:0.fileName = "auto detect"
ide1:0.deviceType = "cdrom-raw"
floppy0.fileName = "A:"
ethernet0.present = "TRUE"
usb.present = "TRUE"
sound.present = "TRUE"
sound.virtualDev = "es1371"
displayName = "FedoraCore5"
仮想マシンのウィンドウ表示名。
guestOS = "other"
nvram = "disk.nvram"
・CD ドライブにインストール用メディアを入れ、設定を記述した vmx ファイルをダブルク
リックして VMwarePlayer を起動する。
後は、ウィンドウ内で通常のインストールと同様に作業を進めることが出来る。
Ⅰ-15
全体の流れ
項
番
1
日
目
2
日
目
3
日
目
操作機器
操作内容
資料名
1 サーバ
Linux(Fedora Core 5)のインストール
Fedora Core5 OSインストール資料、
添付資料1
FTPサーバの設定資料
2 サーバ
FTPサーバの環境設定
3 端末
FTPクライアントの環境設定
4 端末
MS-Wordで文を作成し、HTML形式でindex.htmlとして保存する。
5 端末
FTPクライアントからサーバに項番4で作成したファイルを
/var/www/htmlに転送する。
6 サーバ
HTTPDの環境設定
7 端末
IEでサーバのURL(http://IPアドレス)を入力し項番6で作成した文書が
表示されることを確認する。
8 端末
DNS設定ファイル(ゾーンファイル)をメモ帳で作成する。
9 端末
項番8で作成したファイルを/var/namedに転送する。
HTTPサーバの設定資料
DNSサーバの設定資料
(1)・(2)のファイル
DNSサーバの設定資料
項番1~9
10 サーバ
DNSサーバの環境設定
11 端末
ネットワークのプロパティでDNSサーバのIPアドレスを設定する。
12 端末
IEでサーバのURL(http://ホスト名)を入力し項番4で作成した文書が表
示されることを確認する。
13 端末
DNS設定ファイル(ゾーンファイル)をメモ帳で修正する。
14 端末
項番13で修正したファイルをサーバに転送する。
15 サーバ
DNS設定ファイルの再読み込み
16 端末
IEでサーバのURL(http://www.ドメイン名)を入力し項番4で作成した文
書が表示されることを確認する。
17 サーバ
メールサーバ(MTA)の環境設定を行う。
メールサーバの設定資料
項番1~5
18 サーバ
メールサーバ(MUA)の環境設定を行う。
メールサーバの設定資料
項番6
19 端末
DNS設定ファイル(ゾーンファイル)をメモ帳で修正する。
DNSサーバの設定資料
(5)ファイル名:genkou1 .com.zone
20 端末
項番13で修正したファイルをサーバに転送する。
21 サーバ
DNS設定ファイルの再読み込み
DNSサーバの設定資料
項番10
22 サーバ
メールサーバの起動
メールサーバの設定資料
項番7~10
23 端末
Outlook Expressの設定を行う。
OEの設定資料
24 端末
グループ内のサーバでメールの送受信ができることを確認する。
25 サーバ
DNS設定ファイル(named.ca)の修正
DNSサーバの設定資料
項番11~14
DNS設定ファイルcom.zoneの追加とnamed.confの修正
DNSサーバの設定資料
(6)・(7)のファイル
26
上位
サーバ
27 端末
DNSサーバの設定資料
(4)ファイル名:genkou1 .com.zone
DNSサーバの設定資料
項番10
グループ間でメールの送受信ができることを確認する。
Ⅰ-16
Fedora Core 5 OSインストール資料
項
設定項目
番
1 BIOSの起動デバイス設定
設定内容
起動デバイスの1番目をCD-ROMとする。
2 インストールモード
グラフィカルインストールモード。boot: と表示されたらEnterキーを押す。
3 インストールメディアのテスト
テストしない。Skipを選択する。
4
Fedoraの画像が表示されたら、Nextボタンをクリックする。
5 インストール時の言語
Japanese(日本語)
6 キーボード設定
Japanese
7 ディスクパーティションの設定
そのままの設定で次(N)ボタンをクリックする。
8 ネットワークの設定
添付資料1のホスト名、IPアドレス、ネットマスク、1番目のDNSを設定する。
9 タイムゾーンの選択
アジア/東京
10 Rootパスワードを設定
添付資料1のRootパスワードを入力する。
11 インストールの種類
「Webサーバ」のみチェックを入れ、下の「即時カスタマイズ」を選択して次へ。
12 パッケージの選択
サーバ-メールサーバを追加、オプションパッケージでpostfixを追加
サーバ-DNSネームサーバを追加、オプションパッケージでbind-chrootを削除
サーバ-FTPサーバを追加
13 インストール
自動でインストールは進む。時々CDを入れ替えるだけで良い。
14 再起動
15 ようこそ
次へボタンをクリックする。
16 ライセンス同意書
はい、私は…を選択し 次へボタンをクリックする。
17 ファイヤーウォールの設定
ファイヤーウォールをDisabledにする。
18 SELinuxの設定
SELinuxをDisabledにする。
19 日付と時刻
日付と時刻を合わせて、次へボタンをクリックする。
20 ディスプレイ
解像度を1024×768にする。
21 システムユーザ
添付資料1の一般ユーザを作成する。
22 サウンドカード
次へボタンをクリックする。
23 再起動
24 rootでログイン
Ⅰ-17
FTPサーバの設定資料
項
項目
番
1 エディタを起動する。
2 rootユーザでftpを許可する。
コマンド
[アプリケーション]-[アクセサリ]-[GNOMEテキスト・エディタ]
/etc/vsftpd/user_listからrootを削除する。
/etc/vsftpd/ftpusersからrootを削除する。
3 端末を起動する。
[アプリケーション]-[アクセサリ]-[GNOME端末]
4 FTPサーバを起動する。
service vsftpd start
5 FTPサーバを自動起動する。
chkconfig --level 35 vsftpd on
HTTPサーバの設定資料
項
番
1
項目
/var/www/html/index.htmlが存在
することを確認する。
コマンド
ls /var/www/html
2 HTTPサーバを起動する。
service httpd start
3 HTTPサーバを自動起動する。
chkconfig --level 35 httpd on
Outlook Expressの設定資料
項
項目
番
1 メールアカウントの追加
コマンド
[ツール]-[アカウント]
[追加]-[メール]
2 表示名
グループ名
3 電子メールアドレス
[email protected]
4 電子メールサーバの種類
POP3
受信メール(POP3、IMAPまたは
5
HTTP)サーバ
mail.genkou1.com
6 送信メール(SMTP)サーバ
mail.genkou1.com
7 アカウント名
g1
8 パスワード
genkou-1
Ⅰ-18
DNSサーバの設定資料
項
項目
番
1 DNS設定ファイル(ゾーンファイル)の確認。
コマンド
cd /var/named ;ls
2 ゾーンファイルのチェック
named-checkzone genkou1 genkou1.com.zone
3 逆引きゾーンファイルのチェック
named-checkzone genkou1 genkou1.com.zone.rev
4 エディタを起動する。
[アプリケーション]-[アクセサリ]-[GNOMEテキスト・エディタ]
5 DNS設定ファイル(named.conf)の修正
/etc/named.confを(3)ファイル名:named.confのように編集する。
6 DNS設定ファイル(named.conf)の確認。
cd /etc ;ls -l named.conf
7 DNS設定ファイル(named.conf)のチェック
named-checkconf named.conf
8 DNSサーバを起動する。
service named start
9 DNSサーバを自動起動する。
chkconfig --level 35 named on
10 DNS設定ファイルの再読み込み
rndc reload
11 エディタを起動する。
[アプリケーション]-[アクセサリ]-[GNOMEテキスト・エディタ]
12 DNS設定ファイル(named.ca)の修正
13 DNSサーバを停止する。
/var/named/named.caを以下のように編集する。
A.ROOT-SERVERS.NET.
3600000
A
198.41.0.4
↓
A.ROOT-SERVERS.NET.
3600000
A
192.168.1.221
service named stop
14 DNSサーバを起動する。
service named start
(1)ファイル名:genkou1.com.zone
$TTL 86400
@ IN SOA g1.genkou1.com. root.g1.genkou1.com. (
2007080101 ; serial
3H
; refresh
15M
; retry
1W
; expiry
1D )
; minimum
IN NS
g1 IN A
g1.genkou1.com.
192.168.1.10
(2)ファイル名:genkou1.com.zone.rev
$TTL 86400
@ IN SOA g1.genkou1.com. root.g1.genkou1.com. (
2007080101 ; serial
3H
; refresh
15M
; retry
1W
; expiry
1D )
; minimum
IN NS g1.genkou1.com.
10 IN PTR g1.genkou1.com.
Ⅰ-19
DNSサーバの設定資料
(3)ファイル名:named.conf
//
// named.conf for Red Hat caching-nameserver
//
options {
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
};
//
// a caching only nameserver config
//
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/rndc.key";
zone "genkou1.com" IN {
type master;
file "genkou1.com.zone";
allow-update { none; };
};
zone "1.168.192.in-addr.arpa" IN {
type master;
file "genkou1.com.zone.rev";
allow-update { none; };
};
Ⅰ-20
DNSサーバの設定資料
(4)ファイル名:genkou1.com.zone
$TTL 86400
@ IN SOA g1.genkou1.com. root.g1.genkou1.com. (
2007080102 ; serial
3H
; refresh
15M
; retry
1W
; expiry
1D )
; minimum
修正
IN NS g1.genkou1.com.
g1 IN A
192.168.1.10
www IN CNAME g1
追加
(5)ファイル名:genkou1.com.zone
$TTL 86400
@ IN SOA g1.genkou1.com. root.g1.genkou1.com. (
2007080103 ; serial
3H
; refresh
15M
; retry
1W
; expiry
1D )
; minimum
修正
IN NS g1.genkou1.com.
IN MX 10 mail
g1 IN A
192.168.1.10
www IN CNAME g1
mail IN CNAME g1
追加
追加
Ⅰ-21
DNSサーバの設定資料
(6)ファイル名:com.zone
$TTL 86400
@
IN SOA com.
2007080101
3H
15M
1W
1D )
IN NS
svil1 IN A
root.com. (
; serial
; refresh
; retry
; expiry
; minimum
svil1.com.
192.168.1.221
yoshida.com.
g1.yoshida.com.
yamashita.com.
g2.yamashita.com.
masaki.com.
g3.masaki.com.
yano.com.
g4.yano.com.
matsuda.com.
g5.matsuda.com.
tsubota.com.
g6.tsubota.com.
tsujimura.com.
g7.tsujimura.com.
bando.com.
g8.bando.com.
matsui.com.
g9.matsui.com.
kensyu.com.
g10.kensyu.com.
IN
IN
IN
IN
IN
IN
IN
IN
IN
IN
IN
IN
IN
IN
IN
IN
IN
IN
IN
IN
NS
A
NS
A
NS
A
NS
A
NS
A
NS
A
NS
A
NS
A
NS
A
NS
A
g1.yoshida.com.
192.168.1.10
g2.yamashita.com.
192.168.1.20
g3.masaki.com.
192.168.1.30
g4.yano.com.
192.168.1.40
g5.matsuda.com.
192.168.1.50
g6.tsubota.com.
192.168.1.60
g7.tsujimura.com.
192.168.1.70
g8.bando.com.
192.168.1.80
g9.matsui.com.
192.168.1.90
g10.kensyu.com.
192.168.1.100
(7)ファイル名:named.conf
//
// named.conf for Red Hat caching-nameserver
//
省略
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/rndc.key";
zone "com" IN {
type master;
file "com.zone";
allow-update { none; };
};
追加
zone "genkou1.com" IN {
type master;
file "genkou1.com.zone";
allow-update { none; };
};
省略
Ⅰ-22
メールサーバの設定資料
項
番
1
項目
コマンド
メールサーバ(MTA)をSENDMAILを停
service sendmail stop
止する。
2 メールサーバ(MTA)をPostfixにする。
alternatives --config mta
Postfix を選択する。
3 エディタを起動する。
4
メールサーバ(MTA)の設定ファイル修
/etc/postfix/main.cfを以下のように編集する。
正
5 設定ファイルのチェック
6
[アプリケーション]-[アクセサリ]-[GNOMEテキスト・エディタ]
#myhostname = virtual.domain.tld
↓
myhostname = g1.genkou1.com
#mydomain = domain.tld
↓
mydomain = genkou1.com
#myorigin = $mydomain
↓
myorigin = $mydomain
#inet_interfaces = all
↓
inet_interfaces = all
inet_interfaces = localhost
↓
#inet_interfaces = localhost
mydestination = $myhostname, localhost.$mydomain, localhost
↓
#mydestination = $myhostname, localhost.$mydomain, localhost
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
↓
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#local_recipient_maps = unix:passwd.byname $alias_maps
↓
local_recipient_maps = unix:passwd.byname $alias_maps
#mynetworks = 168.100.189.0/28, 127.0.0.0/8
↓
mynetworks = 192.168.1.0/24, 127.0.0.0/8
postfix check
メールサーバ(MUA)の設定ファイル修
/etc/dovecot.confを以下のように編集する。
正
7 メールサーバを起動する。
#protocols = imap imaps pop3 pop3s
↓
protocols = imap imaps pop3 pop3s
service postfix start
8 メールサーバを自動起動する。
chkconfig --level 35 postfix on
9 メールサーバを起動する。
service dovecot start
10 メールサーバを自動起動する。
chkconfig --level 35 dovecot on
Ⅰ-23
グループ1
ホスト名
g1.
グループ2
.com
g2.
添付資料1
グループ3
.com
g3.
グループ4
.com
g4.
グループ5
.com
g5.
IPアドレス
192.168.1.10
192.168.1.20
192.168.1.30
192.168.1.40
192.168.1.50
ネットマスク
255.255.255.0
255.255.255.0
255.255.255.0
255.255.255.0
255.255.255.0
1番目のDNS
192.168.1.10
192.168.1.20
192.168.1.30
192.168.1.40
192.168.1.50
Rootのパスワード
genkou-1
genkou-2
genkou-3
genkou-4
genkou-5
システムユーザ名(Username)
g1
g2
g3
g4
g5
.com
ゲートウェイ
システムユーザ名(FullName)
system user
system user
system user
system user
system user
システムユーザ名(Password)
genkou-1
genkou-2
genkou-3
genkou-4
genkou-5
システムユーザ名(ConfirmPassword)
同上
同上
同上
同上
同上
グループ6
グループ7
グループ8
グループ9
グループ10
ホスト名
g6.
.com
g7.
.com
g8.
.com
g9.
.com
g10.
IPアドレス
192.168.1.60
192.168.1.70
192.168.1.80
192.168.1.90
192.168.1.100
ネットマスク
255.255.255.0
255.255.255.0
255.255.255.0
255.255.255.0
255.255.255.0
1番目のDNS
192.168.1.60
192.168.1.70
192.168.1.80
192.168.1.90
192.168.1.100
Rootのパスワード
genkou-6
genkou-7
genkou-8
genkou-9
genkou-10
システムユーザ名(Username)
g6
g7
g8
g9
g10
システムユーザ名(FullName)
system user
system user
system user
system user
system user
システムユーザ名(Password)
genkou-6
genkou-7
genkou-8
genkou-9
genkou-10
システムユーザ名(ConfirmPassword)
同上
同上
同上
同上
同上
ゲートウェイ
他の資料にある下線部(genkou1.com )は各個人で決めたホスト名に置き換えて記述すること。genkou1 がホスト名空欄部に当たる。
Ⅰ-24
.com
Ⅱ コンピュータ制御
1.PICによる制御の基礎
1)カウント処理(ラーメンタイマの設計)
2)DCモータの制御(制御回路の設計)
3)DCモータの速度制御(PWM)
☆PICによる制御の基礎・・・指導のヒント
2.サーボモータの制御
4)パルスの作成とサーボモータ
(USBオシロスコープ)
5)外部入力によるサーボモータ制御
6)サーボモータのモーション
7)サーボモータのシナリオ
(テーブル処理)
8)複数サーボモータの制御
9)2軸ロボットの制御(NeeBo)
☆
サーボモータの制御・・・指導のヒント
3.遠隔制御の基礎
10)XPortによる遠隔制御
(信号機の制御)
11)XPort-PIC連携
(2軸ロボットの遠隔制御)
☆ 遠隔制御の基礎・・・指導のヒント
1)カウント処理(ラーメンタイマの設計)
LEDの点滅を使って3分間専用の電子タイマーの作成を行います。
下記回路図は PIC を中心に回路が書かれていますが、この回路図を元に基本のCPU(PIC)
ボードを使い、ユニバーサル基板上に入出力回路を作成します。基板にはボタン(S2)と発光ダイ
オード(D1~D3)、抵抗(R1~R3)、ブザー(BZ)をつけます。
このときの制御プログラムを考えなさい。
プログラム詳細
ボタンを押すと、カウントを始めます。LED は点滅しながら1分に一つづつ消し、3分
経過するとブザー音と LED の点滅で3分経過したことを知らせます。
その後、ボタンを押すと、ブザー音と LED の点滅を終わらせます。
ブザー音の処理
接続されているブザーは圧電ブザーで、onとoffの繰り返しで鳴ります。繰り返しの間隔
を変えることによって音階も表現できます。下の例は「ラ」の音階です。
for(i=0;i<=220;i++)
{
output_bit(PIN_B6,1);
delay_us(1136);
output_bit(PIN_B6,0);
delay_us(1136);
}
Ⅱ-1
音
繰り返し
delay
ド
130
1911
レ
146
1702
ミ
164
1516
ファ
174
1431
ソ
195
1275
ラ
220
1136
シ
246
1012
ド
261
955
回路図
○ +5V
○ GND
○ B0
○ B1
○ B2
○ B3
○ B4
○ B5
○ B6
○ B7
流れ図
プログラム
Ⅱ-2
2)DCモータの制御(入出力回路の設計)
モータ制御IC「TA7291」を使って車の制御回路を考えた。
次の回路図を参考にPICユニバーサル基板での回路図を及び実体配線図を作成しなさい
入力SW
出力モータ
RB3
RB2
RB7
RB6
RB5
RB4
0
0
前進
前進
0
1
前進
後退
1
0
後退
前進
1
1
後退
後退
PICに接続するのは、IN1,IN2 の2ラインだけで、これで正逆転、ストップを制御出来ます。
IN1 IN2
0
0
1
0
0
1
1
1
OUT1、OUT2の端子にモーターをつなぎます。
マイコンからの信号が
マイコン
ドライバ IC
OUT1 OUT2 機能
1 → IN1
で 時計回り(CW:クロックワイズ)
∞ ∞ ストップ
0 → IN2
とすると
H
L
CW
0 → IN1
で 反時計回り(
L
H
CCW
1 → IN2
CCW:カウンタークロックワイズ)
L
L ブレーキ
にコントロールできます。
これ以外に、ストップとブレーキがあります。
ブレーキにするとキュッと歯切れ良くとまります。
〔VREF〕
VREFはモーターへの電圧を調整するときに使います。
通常このピンはモーター電源につなげておきます。
Ⅱ-3
回路図
○ +5V
○ GND
○ B0
○ B1
○ B2
○ B3
○ B4
○ B5
○ B6
○ B7
流れ図
プログラム
Ⅱ-4
3)DCモータの速度制御(PWM制御)
PWMとは
PWM とはパルス幅変調(Pulse Width Modulation)方式と呼ばれる手法です。モーターの速度制御を
電源を高速で入れたり切ったりすることを繰り返すことで実現することです。
「モーターの速さを変えるにはどうしらいい?」と聞くと、「電池の数を増やす!減らす!」とい
う答えが返ってきます。つまり、直列に繋ぐ乾電池の数で、モーターに掛ける電圧を増減させるの
です。普通に考えるとこの答えは正解ですが、一定の電源電圧を供給している場合、モーターに掛
ける電圧だけを変化させるには、抵抗やレギュレータなどで電圧を下げなければなりません。つま
り、余計な電力を消費することによって、モーター電圧を可変させるわけです。これでは効率が悪
いし、マイコンからの制御にも向いていません。
PWM では高速でモーター電源の入り切り(ON/OFF)を繰り返す、と説明しました。もう少し
説明すると、ONにする時間とOFFにする時間の比を変えてあげるのです。この比をデューティ
ー比といいます。下の図の左側では、デューティー比が高いほどONになっている期間が長く、デ
ューティー比がゼロではずっとOFFのままである様子を示しています。
モーターにこういうタイミングで電源を与えてあげると、あたかもアナログ的に電源電圧を可変し
てあげたかのように、速度の制御が可能になります。これが PWM による制御です。
パルス幅だけで制御できるため、マイコンには扱いやすい方式です。
ただし注意が必要なのが、パルスを与える周期です。何秒おきにON/OFFを繰り返すかを最適に設
定してあげないといけません。例えば、周期を10秒に設定したとすると、デューティー比が5の場合、
5秒ON/5秒OFFを繰り返すことになります。これでは、何の役にも立ちません。ON/OFFを
繰り返すといっても、モーターがスムースに回転し続けなければ意味がありません。モーターにはそれ
ぞれ固有の慣性力があり、回転中に電源をOFFにした場合、慣性力によってどれくらいの期間回転を
続けるか、の特性があります。PWM 制御を行なう場合、この慣性力が働く期間で周期を設定してあげな
いとスムースな速度制御が出来ません。大体、数百Hz~数KHzくらいの周期が最適のようです。
Ⅱ-5
DCモータの制御(Hブリッジ)
実習でモータ制御IC「TA7291」を使って車の制御回路を考えました。
PICに接続するのは、IN1,IN2 の2ラインだけで、これで正逆転、ストップを制御出来ます。
IN1 IN2
0
0
1
0
0
1
1
1
OUT1、OUT2の端子にモーターをつなぎます。
マイコンからの信号が
マイコン
ドライバ IC
OUT1 OUT2 機能
1 → IN1
で 時計回り(CW:クロックワイズ)
∞ ∞ ストップ
0 → IN2
とすると
H
L
CW
0 → IN1
で 反時計回り(
L
H
CCW
1 → IN2
CCW:カウンタークロックワイズ)
L
L ブレーキ
にコントロールできます。
これ以外に、ストップとブレーキがあります。
ブレーキにするとキュッと歯切れ良くとまります。
前進を考えるとPICのポートB4~B7に”1010”を与える。STOPはPICの
ポートB4~B7に”0000”を与える。ポートB4,B6が”1”から”0”に変って
いるだけです。このB4・B6ポートに与える値を上手く制御するとスピードが変えられる
はずです。
問1.前進しながらだんだんスピードを落としなさい。
問2.前進しながら右と左の速度を変え円弧を描くように回転しなさい。
問3.前進しながら左右にスラローム走行をしなさい。
TRY:8の字を描きなさい。
Ⅱ-6
========================================
1.PICによる制御の基礎・・・指導のヒント
========================================
目 的
マイクロコンピュータであるPICを用いてコンピュータでの制御方法を、LEDやモータの制
御回路の設計・プログラム作成を行い、基本的な制御の方法を習得する。
学習内容
例題としてカウント回路の設計、DCモータの制御回路の設計、PWMを使った速度制御を行っ
た。基板の設計はユニバール基板を使用し、ポケコン拡張コネクタを用いてCPUボードと接続
するよう設計する。CPUボードは実習「PIC制御ボードの製作」で製作している。開発言語
であるCCS-Cも実習「PICによる入出力制御」で学習済み。
(1)カウント処理(ラーメンタイマの設計)
設計はユニバーサル部分であるが、実際に製作をしていると時間がかかるため、回
路確認を行った。プログラムの確認には、あらかじめこちらが用意したものを使用
した。
回路図
プログラムの解説
プログラム
#include <16f84.h>
・ Bポートに0を出力しLED
#use delay(clock=20000000)
を消して、swの入力を待つ
#fuses HS, NOWDT, PUT, NOPROTECT
・ 0.5 秒間隔の点滅を60回繰
void main()
り返す。それを3回繰り返す
{
間にLED表示をずらす処理
int i,j,x=0;
set_tris_b(0x81);
(x*2)を行う
output_b(0);
・ 最後にSWが押されるまで音
while(input(PIN_B7));
//sw 入力待ち
を鳴らしながら3つのLED
x=1;
を点滅させている。
for(i=0;i<3;i++)
{x=x*2;
for(j=0;j<60;j++)
{output_b(x);
delay_ms(500);
output_b(0);
delay_ms(500);
}
}
x=0;
while(input(PIN_B7)){
if(x==0)x=14;else x=0; //点滅
output_b(x);
for(i=0;i<220;i++)
//beep 音
{output_bit(pin_b6,1);delay_us(1136);
output_bit(pin_b6,0);delay_us(1136);
}
}
return;}
Ⅱ-7
(2)DCモータの制御(制御回路の設計)
回路図
プログラム
・ ポートB4、B5で右モー
タ、B6,B7で左モータを
制御している。
・ sw が入力されるまで停止
・ sw が入力されたら前進→後
退の処理を行う
・ 一定時間処理を行ったら停
止する
・
#include <16f84a.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,PUT,NOPROTECT
int main(){
long i;
set_tris_b(0x0f);
output_bit(PIN_B4,0);
output_bit(PIN_B5,0);
output_bit(PIN_B6,0);
output_bit(PIN_B7,0);
while(input(PIN_B0));
for(i=0;i<1000;i++){
output_bit(PIN_B4,0);
output_bit(PIN_B5,1);
output_bit(PIN_B6,0);
output_bit(PIN_B7,1);
delay_us(100);
}
output_bit(PIN_B4,0);
output_bit(PIN_B5,0);
output_bit(PIN_B6,0);
output_bit(PIN_B7,0);
delay_us(100);
for(i=0;i<1000;i++){
output_bit(PIN_B4,1);
output_bit(PIN_B5,0);
output_bit(PIN_B6,1);
output_bit(PIN_B7,0);
delay_us(100);
}
output_bit(PIN_B4,0);
output_bit(PIN_B5,0);
output_bit(PIN_B6,0);
output_bit(PIN_B7,0);
return 0;
}
Ⅱ-8
(3)DCモータの速度制御(PWM)
モータのonの時間とoffの比率を変えて速度の調整を行う。オフの時間の比が大きい
とモータそのものが停止してしまうので、ヂューティー比は5以下には出来ない。
問題1
#include <16f84a.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,PUT,NOPROTECT
int main(){
long i,j,k;
set_tris_b(0x0f);
output_bit(PIN_B4,0);
output_bit(PIN_B5,0);
output_bit(PIN_B6,0);
output_bit(PIN_B7,0);
while(input(PIN_B0));
for(j=0;j<50;j++){
for(i=0;i<255;i++){
output_bit(PIN_B5,1);
output_bit(PIN_B7,1);
for(k=0;k<10;k++){delay_us(50-j);}
output_bit(PIN_B5,0);
output_bit(PIN_B7,0);
for(k=0;k<10;k++){delay_us(j);}
}
}
return 0;
}
}
片方のモータのみpwm制御で速度調整
try問題
;
//sw 入力までは問題1と同じ
while(input(PIN_B0));
for(j=0;j<20;j++){
for(i=0;i<255;i++){
output_bit(PIN_B5,1);
output_bit(PIN_B7,1);
delay_us(500);
output_bit(PIN_B5,1);
output_bit(PIN_B7,0);
delay_us(500);
}}
for(j=0;j<20;j++){
for(i=0;i<255;i++){
output_bit(PIN_B5,1);
output_bit(PIN_B7,1);
delay_us(500);
output_bit(PIN_B5,0);
output_bit(PIN_B7,1);
delay_us(500);
}}
output_bit(PIN_B4,0);
output_bit(PIN_B5,0);
output_bit(PIN_B6,0);
output_bit(PIN_B7,0);
return 0;
onの時間を増やし、offの時間を減らしていく
}
問題2
:
//sw 入力までは問題1と同じ
while(input(PIN_B0));
for(j=0;j<20;j++){
for(i=0;i<255;i++){
output_bit(PIN_B5,1);
output_bit(PIN_B7,1);
delay_us(500);
output_bit(PIN_B5,1);
output_bit(PIN_B7,0);
delay_us(500);
}
}
output_bit(PIN_B4,0);
output_bit(PIN_B5,0);
output_bit(PIN_B6,0);
output_bit(PIN_B7,0);
return 0;
問題3
;
//sw 入力までは問題1と同じ
while(input(PIN_B0));
for(j=0;j<20;j++){
for(i=0;i<255;i++){
//右を半分
output_bit(PIN_B5,1);
output_bit(PIN_B7,1);
delay_us(500);
output_bit(PIN_B5,1);
output_bit(PIN_B7,0);
delay_us(500);
}
for(i=0;i<255;i++){
//左を半分
output_bit(PIN_B5,1);
output_bit(PIN_B7,1);
delay_us(500);
output_bit(PIN_B5,0);
output_bit(PIN_B7,1);
delay_us(500);
}}
output_bit(PIN_B4,0);
output_bit(PIN_B5,0);
output_bit(PIN_B6,0);
output_bit(PIN_B7,0);
return 0;
}
問題3と基本的に同じで、時間を調整している
左右のモータのoffの時間を半分にしている
Ⅱ-9
4)パルスの作成とサーボモータ(USBオシロ)
1.
自作制御ボードとサーボモータとの接続は下記のようになっています。サーボモータを制御するため
のパルスを作成し、USBオシロスコープでパルス発生の確認を行う。
SWはoffのときに真(1)、onのとき偽(0)となりモーター制御のコントロールを行います。
処理の流れ
制御はA2に接続(予定)されたサーボモータとする。
電源が入った状態でサーボモータは中立の状態(1500μsec)にする。
swが押されたら一番左(700μsec)の位置に回る。
パルス周期を20msecとする。
それぞれのパルス周期をUSBオシロで確認する。
プログラム
#include <16f84a.h>
#use delay(clock=20000000)
#fuses HS, NOWDT, PUT, NOPROTECT
void main()
{
set_tris_a(
);
set_tris_b(
);
while(input(PIN_B0))
//スタートボタンの入力待ち
{
output_bit(PIN_A2,1);
//中立の状態
delay_us(
);
output_bit(PIN_A2,0);
delay_us(
);
}
while(1)
//永久ループ
{
output_bit(PIN_A2,1);
//左の状態
delay_us(
);
output_bit(PIN_A2,0);
delay_us(
);
}
Ⅱ-10
2.USBオシロによる波形観測の使用法
サーボモータの位置を指定する信号のパルス幅は1.5msecを中心に±800μsecになっ
ている。コントロールするプログラムを構築する上で波形を観察する必要がある。
◎PICからの対象信号をPCにUSB接続した
オシロによりサンプリングする。
・PCにUSBオシロを接続する。
・PICライターにより書き込んだPIC
を基盤に装着する。
・プローブをチャンネルAに差し込み基盤
の出力信号線に接続する。
◎ アプリケーションプログラム(EasyLogger)の起動
・Sample Interval10μs程度にする。
・出力波形により値を調整する。
・基盤上のPICを起動させる。
・ツールバーのスタートボタン
をクリックして記録を開始する。
・記録ができたらストップボタン
により記録を
終了する。
・再度、記録する場合はメニューバーの Runから
Clear Screenをクリックし画面を初期化する。
Ⅱ-11
5)外部入力によるサーボモータの制御
1.
自作制御ボードとサーボモータとの接続は下記のようになっています。SWの入力の値によりサーボ
モータの動作を制御する。
SWはoffのときに真(1)、onのとき偽(0)となりモーター制御のコントロールを行います。
処理の流れ
制御はA2に接続されたサーボモータとする。
電源が入った状態でサーボモータは中立の状態にする。
swが押されたら一番左の位置に回る。
swが離されたら一番右の位置に回る。
2.フローチャート
プログラム
#include <16f84a.h>
#use delay(clock=20000000)
#fuses HS, NOWDT, PUT, NOPROTECT
void main()
{
set_tris_a(
);
set_tris_b(
);
while(input(PIN_B0))
//スタートボタンの入力待ち
{
output_bit(PIN_A2,1);
//中立の状態
delay_us(
);
output_bit(PIN_A2,0);
delay_us(
);
}
Ⅱ-12
6)サーボモータのモーション
自作制御ボードとサーボモータとの接続は下記のようになっています。サーボモータに連続した動作(モ
ーション)をさせます。
SWはoffのときに真(1)、onのとき(0)となりモーター制御のコントロールを行います。
サーボモータは700~2300μs で0度~180度を示します。パルス幅を10μs 増やすとサ
ーボは
度変化します。サーボを45°変化させるにはパルス幅を
μs 増やす。
○処理の流れ
制御はA2に接続されたサーボモータとする。
電源が入った状態でサーボモータは中立の状態にする。
swが押されたら、サーボモータを
0°、45°、90°、135°、180°、0°・・・ と変化させなさい。
パルス幅だと
、
、
、
、
、
、・・・
それぞれの位置を各1秒程度保持しなさい。
2.フローチャート
プログラム
:
void main()
{
set_tris_a(
set_tris_b(
:
中立の状態
:
Ⅱ-13
);
);
7)サーボモータのシナリオ(テーブル)
自作制御ボードとサーボモータとの接続は下記のようになっています。連続した動作を配列に入れて制
御します。配列に入れることで、より複雑な動作が制御できます。
SWはoffのときに真(1)、onのとき(0)となり
モーター制御のコントロールを行います。
○処理の流れ
制御はA2に接続されたサーボモータとする。
電源が入った状態でサーボモータは中立の状
態にする。swが押されたら、サーボモータを
0°、45°、90°、135°、180°、0°・・・
と変化させなさい。
各角度データを配列に格納して処理できるように考えなさい。
それぞれの位置を各1秒程度保持しなさい。
プログラム例(1000us 幅のパルス)
int dt=100;
時間待ち関数 delay_us(dt)を使用してパルスを
:
作成しますが、このとき変数dtは0~255まで
output_bit(PIN_A2,1); //パルス on
の値であることから、この値を十分の一でテーブル
for(i=1;i<=10;i++) delay_us(dt);
を作成し、プログラムで10倍する。
output_bit(PIN_A2,0); //パルス off
for(i=1;i<=10;i++)delay_us(250-dt);
:
2.フローチャート
プログラム
:
void main()
{
int mot[5]={70,110,150,190,230}; //モーションテーブル
set_tris_a(
);
set_tris_b(
);
:
中立の状態
:
Ⅱ-14
8)複数サーボモータの制御
自作制御ボードとサーボモータとの接続は下記のようになっています。複数のサーボモータを制御する方
法を考えます。
○処理の流れ
・制御はA2,A3に接続されたサーボモータとする。
・電源が入った状態でサーボモータは中立の状態にする。
・swが押されたら、
サーボモータ1(A2)は
0°,45°,90°,135°,180°,0°・・・と変化させ
サーボモータ2(A3)は
180°, 135°, 90°, 45°,0°,180°,・・・と変化させなさい。
・各角度データを配列に格納して処理できるように考えなさい。
それぞれの位置を各1秒程度保持しなさい。
2.フローチャート
プログラム
:
void main()
{
int mot1[5]={70,110,150,190,230}; //モーションテーブル 1
int mot2[5]={230,190,150,110,70}; //モーションテーブル 2
set_tris_a(
);
set_tris_b(
);
:
中立の状態
:
Ⅱ-15
複数のサーボモータの制御の考えかた
今回使用しているサーボモータは右記のようなパ
ルスを与えることによりサーボの位置を制御してい
ます。パルス周期は最大20000μsec である。
それに対して制御パルスは700~2300μsec
の間なので、仮に1つのサーボモータを制御するのに
5000μsec を割り当てると4つのサーボモータ
が制御できる。下記に4つのサーボモータを制御する
例を示します。
20000μs
5000μs
サーボ1のパルス
5000μs
サーホ2のパルス
5000μs
5000μs
サーボ3のパルス
サーボ4のパルス
1
サーボ1
0
1
サーボ2
0
1
サーボ3
0
1
サーボ4
0
右のプログラムはサーボ1~4をそれぞれ
0°~135°の位置を維持するもので
す。各サーボはRA0~RA3に接続さ
れているものとします。
注意)実際のプログラム作成時には
Delay()の引数は255までの
値しか与えられないので注意す
ること。
プログラム例
int savo1=700;
//
0°
int savo2=1100;
//
45°
int savo3=1500; //
90°
int savo4=1900; // 135°
:
while(1){
output_bit(PIN_A0,1); //サーボ 1 パルス on
delay_us(savo1);
output_bit(PIN_A0,0); //サーボ 1 パルス off
delay_us(5000-savo1);
output_bit(PIN_A1,1); //サーボ 2 パルス on
delay_us(savo2);
output_bit(PIN_A1,0); //サーボ 2 パルス off
delay_us(5000-savo2);
output_bit(PIN_A2,1); //サーボ 3 パルス on
delay_us(savo3);
output_bit(PIN_A2,0); //サーボ 3 パルス off
delay_us(5000-savo3);
:
Ⅱ-16
9)2軸ロボットの制御(NeeBo)
2軸歩行ロボットNeeBoの制御を考える。サーボモータとの接続は下記のようになっています。
複数のサーボーモータの制御の考え方で、頭と腰のサーボモータを制御し、2軸ロボットを制御します。
○処理の流れ
・頭と腰はA2,A3に接続されたサーボモータとする。
・電源が入った状態でサーボモータは中立の状態にする。
・swが押されたら、
頭サーボモータ(A2)は、中立(90°)±45°の範囲内で動作させます。
腰サーボモータ(A3)は、中立(90°)±30°の範囲内で動作させます。
・各角度データを配列に格納し、繰り返すことで動作を処理できるように考えなさい。
・前進と後退のモーションを考えなさい
各サーボの位置、繰り返し速度、頭と腰の動きの組み合わせなど試行錯誤をして考える。
プログラム
:
void main()
{
int mot1[10]={110,190,110,190・・・・}; //頭のモーション
int mot2[10]={175,125,175,125・・・・}; //腰のモーション
set_tris_a(
);
set_tris_b(
);
:
中立の状態
:
前進のモーション
ステップ
頭
腰
1
2
3
4
5
後退のモーション
ステップ
1
2
3
4
5
Ⅱ-17
頭
腰
========================================
2.サーボモータの制御・・・・指導のヒント
========================================
目 的
サーボモータをコントロールするための制御信号および基本的な動作原理について理解を深め、
制御方法を習得する。サーボモータをコントロールするための制御信号を出力させるために必要
な知識・技術を習得し、プログラムを作成できる能力を養う。
学習内容
●制御信号(パルス信号)および基本的な動作原理について
20ms の周期で 0.7ms から 2.3ms 幅のパルス信号を加えると、サーボはパルス幅に見合った角度で
左右に首を振ります。1.5ms 幅のパルスにすると、中間位置で停止し、それよりも短いパルス幅
だと左周りに、長いパルス幅だと右周りに首を振ります。
つまり、1.5ms幅を中心として、±約 0.8msだけパルス幅を増減させることによって、連続的
に首振りの角度を制御することができます。
●今回使用するサーボモータの説明
近藤科学(株) KO PROPO ニュートラル 1500[μsec]
●プログラム言語として CCS-C を選択した理由
正確な時間制御が必要なサーボモータではあ
るが、PIC のシステムクロックが20MHzと高
速なため、誤差はあまり考えなくてもよいと考
えた。実際アセンブラ命令を1命令実行するに
は 0.2μs でよく、C言語1命令がアセンブラ5命令
前後で実行されるため、サーボを制御するには数
μs、角度にして0.1度程度である。ロボットの制御
にはそこまでの正確さは必要とされない。
下のプログラムはサーボを中立の位
置(中央)にさせるためのものです。
while(1){
output_bit(PIN_A2,1);
delay_us(1500);
output_bit(PIN_A2,0);
delay_us(18500);
}
Ⅱ-18
可変範囲 ±800[μsec]
4)パルスの作成とサーボモータ
(USBオシロスコープ)
#include <16f84a.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,PUT,NOPROTECT
void main(){
set_tris_a(0x00);
set_tris_b(0xff);
while(input(PIN_B0)){
output_bit(PIN_A2,1);
delay_us(1500);
output_bit(PIN_A2,0);
delay_us(18500);
}
while(1){
output_bit(PIN_A2,1);
delay_us(700);
output_bit(PIN_A2,0);
delay_us(19300);
}
return ;
}
5)外部入力によるサーボモータ制御
#include <16f84a.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,PUT,NOPROTECT
void main(){
set_tris_a(0x00);
set_tris_b(0xff);
while(input(PIN_B0)){
output_bit(PIN_A2,1);
delay_us(1500);
output_bit(PIN_A2,0);
delay_us(18500);
}
while(1){
if(input(PIN_B0)){
output_bit(PIN_A2,1);
delay_us(700);
output_bit(PIN_A2,0);
delay_us(19300);
}else{
output_bit(PIN_A2,1);
delay_us(2300);
output_bit(PIN_A2,0);
delay_us(17700);
}
}
return ;
}
7)サーボモータのシナリオ (テーブル処理)
#include <16f84a.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,PUT,NOPROTECT
void main(){
long i,j,k;
int mot[5]={70,110,150,190,230};
set_tris_a(0x00);
set_tris_b(0xff);
while(input(PIN_B0)){
output_bit(PIN_A2,1);delay_us(1500);
output_bit(PIN_A2,0);delay_us(18500);
}
while(1){
for(j=0;j<5;j++){
for(i=0;i<50;i++){
for(k=0;k<10;k++){
output_bit(PIN_A2,1);
delay_us(mot[j]);}
for(k=0;k<10;k++){
output_bit(PIN_A2,0);
delay_us(250-mot[j]);}
delay_us(17500);
}
}
}
}
6)サーボモータのモーション
#include <16f84a.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,PUT,NOPROTECT
void main(){
long i;
set_tris_a(0x00);
set_tris_b(0xff);
while(input(PIN_B0)){
output_bit(PIN_A2,1);delay_us(1500);
output_bit(PIN_A2,0);delay_us(18500);
}
while(1){
for(i=0;i<50;i++){
output_bit(PIN_A2,1);delay_us(700);
output_bit(PIN_A2,0);delay_us(19300);
}
for(i=0;i<50;i++){
output_bit(PIN_A2,1);delay_us(1100);
output_bit(PIN_A2,0);delay_us(18900);
}
for(i=0;i<50;i++){
output_bit(PIN_A2,1);delay_us(1500);
output_bit(PIN_A2,0);delay_us(18500);
}
for(i=0;i<50;i++){
output_bit(PIN_A2,1);delay_us(1900);
output_bit(PIN_A2,0);delay_us(18100);
}
for(i=0;i<50;i++){
output_bit(PIN_A2,1);delay_us(2300);
output_bit(PIN_A2,0);delay_us(17300);
}
}
}
●関数の引数として変数(変数を使った式)
を使用する場合、最大255までしか許さ
れない。そのため引数の値を小さくし、そ
の文だけ繰り返しの処理で対応すること
が必要。
●モーションデータが多くなるとPICの
RAM領域が足らなくなるので、ROM領
域にデータを定義するなどの工夫が必要
である。
●サーボモータのパルス周期を20msに
してプログラムを策したが、実際には8
ms~20msの範囲があるので、off
の時間は一律10msで考えてもよ
い。・・・プログラムが簡単になる。
Ⅱ-19
8)複数サーボモータの制御
:
void main(){
long i,j,k;
int mot1[5]={70,110,150,190,230};
int mot2[5]={230,190,150,110,70};
set_tris_a(0x00);
set_tris_b(0xff);
while(input(PIN_B0)){
output_bit(PIN_A2,1);delay_us(1500);
output_bit(PIN_A2,0);delay_us(18500);
output_bit(PIN_A3,1);delay_us(1500);
output_bit(PIN_A3,0);delay_us(18500);
}
while(1){
for(j=0;j<5;j++){
for(i=0;i<50;i++){
for(k=0;k<10;k++){output_bit(PIN_A2,1);delay_us(mot1[j]);}
for(k=0;k<10;k++){output_bit(PIN_A2,0);delay_us(250-mot1[j]);}
delay_us(7500);
for(k=0;k<10;k++){output_bit(PIN_A3,1);delay_us(mot2[j]);}
for(k=0;k<10;k++){output_bit(PIN_A3,0);delay_us(250-mot2[j]);}
delay_us(7500);
}
}
9)2軸ロボットの制御(NeeBo)
}
:
}
void motion(int ,int);
void main(){
long i,j,k;
int mot1[16]={177,177,150,123,123,150,177,150,123,150,123,177,150,177,123,150};
int mot2[16]={136,136,150,164,164,150,136,150,164,150,136,136,150,164,164,150};
set_tris_a(0x00);
set_tris_b(0xff);
while(input(PIN_B0)){
output_bit(PIN_A2,1);delay_us(1500);
output_bit(PIN_A2,0);delay_us(18500);
output_bit(PIN_A3,1);delay_us(1500);
output_bit(PIN_A3,0);delay_us(18500);
}
for(i=0;i<4;i++){motion(0,2);}
void motion(int m1,int m2)
motion(2,2);delay_ms(1000);
{
for(i=0;i<4;i++){motion(3,5);}
int i,j,k;
motion(2,2);delay_ms(1000);
for(j=m1;j<=m2;j++){
for(i=0;i<3;i++){motion(6,9);}
for(i=0;i<20;i++){
motion(2,2);delay_ms(1000);
for(k=0;k<10;k++){
for(i=0;i<2;i++){motion(10,15);}
output_bit(PIN_A2,1);delay_us(mot1[j]);}
motion(2,2);delay_ms(1000);
for(k=0;k<10;k++){
return;
output_bit(PIN_A2,0);delay_us(250-mot1[j]);}
}
delay_us(7500);
for(k=0;k<10;k++){
output_bit(PIN_A3,1);delay_us(mot2[j]);}
for(k=0;k<10;k++){
output_bit(PIN_A3,0);delay_us(250-mot2[j]);}
delay_us(7500);
}
}
return;
}
Ⅱ-20
10)XPortによる遠隔制御
ネットワークを使っての制御は実習でも行いましたが、PC-PC間の制御でした。しかし、制御する対象物
を常にPCに接続しておくのは経済的ではありません。そこで、デバイス・サーバと呼ばれる物を使用し、
ネットワーク経由で制御する方法を学習します。デバイス・サーバと呼ばれる機器にはPICNICやXPort
等があります。
PICNICとはPICにイーサネットコントローラを組み合わ
せてあり、ボードコンピュータの形になっています。PICそ
のものは数百円で購入できますが、コントローラ部分など
の配線が複雑になります。最近では PIC18F67J60-I/PTP
(右回路内の右下の黒いチップ)などイーサネットコントロ
ーラを内蔵した物もあり、多機能な処理が可能です。しか
し、回路設計など素人では難しいと思われます。
XPortは右写真のように小型ですがイ
ーサネットの処理に必要なことが詰まって
います。汎用入出力ピンが3本あるので、
外部機器のコントロールや、PICなどに
簡単に接続出来ます。今回はこのXPor
tを使用します。
XPortとは
XPort は、RJ-45 コネクターサイズに CPU、イーサチップ、RTOS、TCP/IP と
その上位アプリケーション層までを実装した、超小型デバイスサーバーで
す。親指大の大きさの中に、ネットワーク化に求めるほとんど全ての要素を
凝縮してます。
TCP/IP 通信は一般的に多くの CPU リソースを必要としますが、XPort 自身で必要な通信能力を完結して
いますので、使用機器の CPU に負担を掛けません。
さらに XPort には WEB サーバー機能、E メールによるアラート機能を標準で搭載していますので、XPort
を実装することで、TCP/IP に付随する諸機能(上位アプリケーション)の開発期間、コスト、動作試験、リ
スクなども大幅に低減させることが出来ます。
Ⅱ-21
1. 概要
(a)シリアル通信の機能を持った機器をネットワーク対応に出来る。
(b)3ビットの汎用I/Oポートがあり、リレーやAC機器を制御したり、PICなどのマイコンに接続
することにより細かな制御が行える。
(c)XPortがWebサーバになることで、XPortの制御をブラウザソフトから行える。
(d)TCP/IPプロトコルなど多くのプロトコルがサポートされているので、各プロトコルの扱える
開発言語で制御が出来る(VB・c#・JAVAなど)
サポートプロトコル
TCP/IP, UDP/IP, ARP, Telnet, ICMP, SNMP, TFTP, Telnet, DHCP,
BOOTP, HTTP, Auto IP
通信互換
Ethernet: Version 2.0/IEEE 802.3
インターフェース
RJ45 (10BASE-T, 100BASE-TX)
シリアルインターフェース
CMOS (Asynchronous) 3.3V-level signals.
転送速度
Speed software selectable (300 ~ 920 Kbps)
モデムコントロール
DTR, DCD, CTS, RTS
フローコントロール
XON/XOFF, CTS/RTS
マネージメント
Internal Web server, SNMP (read only), Serial login, Telnet login
セキュリティ
パスワードプロテクション 256-bit AES Rijndael encryption
システムソフトウェア
新たなファームウェアをフラッシュメモリーにダウンロード可能。
消費電力
+3.3V (±5%) regulated. Current is 130mA (idle), 140mA (10 BaseT
activity), 210mA (100 BaseT activity).
内蔵メモリー
RAM: 256K Flash: 512K(ユーザ領域は 384KB)
寸法
18.25mm x 14.50mm x 33.90mm
Ⅱ-22
2.通信フォーマット
2.1 ポート番号
ポート番号は、30704(0x77F0)です。TCP の場合は接続を経て使用します。
2.2 送信データ仕様
送信データは9バイトの固定長となっています。
[1バイトのコマンド]、[4バイトのパラメータ1]、[4バイトのパラメータ2]の9バイト
から構成されます。コマンドの種類によってはパラメータが意味を持たないケースがあ
りますが、この場合でも00 を入れるなどを行い、9バイト長のデータを送信して下さい。
意味を持たない部分をXPort/WiPort は無視します。
XPort : パラメータの1バイト目のbit2 がCP3、bit1 がCP2、bit0 がCP1 に対応
(CP1~CP3 は、GPIO 0~GPIO 2という呼称もしています)
(Configure Pin はGPIO という呼称もしています)
2.2 レスポンス仕様
レスポンス(受信データ)は、5バイトの固定長となっています。
レスポンスのコマンド部は、送信データのコマンドがそのまま返ります。
コマンドを送信する場合は、前回発行したコマンドのレスポンスを確認後に発行して下さい。
3.各コマンド例とそのレスポンス例 (この例はXPort のCP1~CP3 での説明をしています)
3.1 機能設定確認コマンド0x10
このコマンドは、汎用I/O として定義されているピンを確認します。パラメータ1,2
には情報を入れません。 レスポンスでは1のbit が汎用I/O、0のbit がその他です。
コマンド
10-00-00-00-00-00-00-00-00
レスポンス 例1 10-02-00-00-00
CP2 のみが汎用I/O と確認
レスポンス 例2 10-03-00-00-00
CP1 とCP2 が汎用I/O と確認
レスポンス 例3 10-04-00-00-00
CP3 のみが汎用I/O と確認
Ⅱ-23
3.2 入出力方向設定確認コマンド0x11
このコマンドは、汎用I/O として定義されているピンの入出力方向設定を確認します。
パラメータ1,2には情報を入れません。
レスポンスでは1のbit が出力、0のbit が入力となります。
コマンド
11-00-00-00-00-00-00-00-00
レスポンス 例1 11-00-00-00-00
汎用I/O は全て入力と確認
レスポンス 例2 11-05-00-00-00
汎用I/O はCP1,3 が出力、
CP2 が入力と確認
注:汎用I/O と定義されていないピンの状態の確認は出来ません。
3.3 アクティブLow/アクティブHigh 設定確認コマンド0x12
このコマンドは、汎用I/O として定義されているピンのアクティブLow/アクティブ
High 設定を確認します。パラメータ1,2には情報を入れません。
レスポンスでは1のbit がアクティブLow、0のbit がアクティブHigh となります。
コマンド
12-00-00-00-00-00-00-00-00
レスポンス 例1 12-00-00-00-00
汎用I/O はアクティブHigh と確認
レスポンス 例2 12-07-00-00-00
汎用I/O はアクティブLow と確認
注:XPort でのアクティブLow/アクティブHigh 設定は全汎用I/O 共通の設定です。
汎用I/O と定義されていないピンの状態の確認は出来ません。値は不確定です。
3.4 アクティブ/非アクティブ確認コマンド0x13
このコマンドは、汎用I/O として定義されているピンのアクティブ/非アクティブを確
認します。パラメータ1,2には情報を入れません
レスポンスでは1のbit がアクティブ、0のbit が非アクティブとなります。
コマンド
13-00-00-00-00-00-00-00-00
レスポンス例1
13-01-00-00-00
汎用I/O はCP1 がアクティブと確認
レスポンス 例2 13-04-00-00-00
汎用I/O はCP3 がアクティブと確認
注:汎用I/O と定義されていないピンの状態の確認は出来ません。値は不確定です。
3.5 アクティブ/非アクティブ設定コマンド0x1B
このコマンドは、汎用I/O 出力として定義されているピンのアクティブ/非アクティブ
を設定します。パラメータ1ではどのピンの設定を変更するかを指定します。1で設定
変更、0で設定変更なしです。
パラメータ2では指定されたピンのアクティブ/非アクティブを設定します。1でアク
ティブ、0で非アクティブです。
コマンド例 1B-05-00-00-00-05-00-00-00 CP1、CP3 をアクティブに設定
レスポンス例 1B-05-00-00-00 更新状態を回答
注:汎用I/O の出力と定義されていないピンの設定は出来ません。
汎用I/O の出力でないピンのレスポンスは不確定です。
パラメータ1で設定変更を行わないピンを、パラメータ2でアクティブにする
などの不適当なコマンドが発行された場合は、レスポンスは不確定になります。
Ⅱ-24
●信号機の制御・・・XPortによる遠隔制御
ディバイス・サーバであるXPortを使用して信号機の模型を制御する。
制御は各PCよりC#を使用して TCP/IP 通信にて行う。
処理1)各色のボタンを作成し、ボタンを押した色を点灯させる。
処理2)点滅ボタンを作成し、点灯している色を点滅させる。
処理3)信号機ボタンを作成し、信号機のシミュレーションを行う。
(192.168.1.216)
◎TCP/IPの通信
XPortのIPアドレス・・・192.168.1.216
ポート番号・・・・・・・・・・30704
◎コントロールコマンドは9バイトのデータを配列の形で与える。
2バイト目・・・変更する汎用I/Oピン
5バイト目・・・変更する値
送信データの領域確保
byte[] send = new byte[9];
送信データの設定
send[0] = 0x1b;
send[1] = 0x07;
:
send[5] = 0x03;
:
send[8] = 0x00;
参考:Microsoft Visual Studio 2005 C#
*** Client Program ***
private void button1_Click(object sender, EventArgs e)
{
System.Net.Sockets.TcpClient client = new System.Net.Sockets.TcpClient();
client.Connect(textBox2.Text , 50001);
System.Net.Sockets.NetworkStream stream = client.GetStream();
byte[] send = Encoding.ASCII.GetBytes(textBox1.Text);
stream.Write(send, 0, send.Length);
client.Close();
}
using System;
Ⅱ-25
XPort制御プログラム例
using
using
using
using
using
using
using
using
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Text;
System.Windows.Forms;
System.Net;
System.Net.Sockets;
namespace Xport_client
{
public partial class Form1 : Form
{
byte[] send = new byte[9];
//送信データ領域の確保
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
TcpClient tc = new TcpClient();
tc.Connect(textBox1.Text, 30704);
NetworkStream ns = tc.GetStream();
send[5] = 0x01;
//汎用I/Oポートへの送信データ
ns.Write(send, 0, 9);
tc.Close();
}
private void button2_Click(object sender, EventArgs e)
{
:
:
private void Form1_Load(object sender, EventArgs e)
{
send[0] = 0x1b;
//送信データ領域の初期設定
send[1] = 0x07;
send[2] = 0x00;
send[3] = 0x00;
send[4] = 0x00;
send[5] = 0x00;
send[6] = 0x00;
send[7] = 0x00;
send[8] = 0x00;
}
}
}
Ⅱ-26
11)XPort-PIC連携(2軸ロボットの遠隔制御)
ディバイス・サーバであるXPortを使用して2軸ロボットNeeBoを制御する。このとき
NeeBoは直接制御出来ないため一度PICに信号を送り、その内容によってNeeBoの動
作をPICで制御を行うこととする。
(192.168.1.215)
制御は各PCよりC#を使用して
TCP/IP 通信にて行う。
処理)モーション番号のボタンを
作成し、押したモーション
を実行させる。
◎TCP/IPの通信
XPortのIPアドレス・・・192.168.1.215
ポート番号・・・・・・・・・・30704
◎コントロールコマンドは9バイトのデータを配列の形で与える。
2バイト目・・・変更する汎用I/Oピン
5バイト目・・・変更する値
送信データの領域確保
byte[] send = new byte[9];
送信データの設定
send[0] = 0x1b;
send[1] = 0x07;
:
send[5] = 0x03;
:
send[8] = 0x00;
Ⅱ-27
PC側のプログラム
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace Xport_client
{
public partial class Form1 : Form
{
byte[] send = new byte[9];
public Form1()
{
InitializeComponent();
}
PIC側のプログラム
void main()
{
int mot1[4]={110,190,110,190};//前進 肩
int mot2[4]={175,125,175,125};//前進 腰
:
set_tris_a(0x00);
set_tris_b(0x1f);
:
中立の状態
:
if(input(PIN_B2)==1){
//前進モーション
{for( i=0; i<4; i++ )
{for( j=0; j<10; j++ )
{output_bit(PIN_A2,1);
for( k=0; k<10; k++ )delay_us(Mot1[i]);
output_bit(PIN_A2,0);delay_ms(1);
output_bit(PIN_A3,1);
for( k=0; k<10; k++ )delay_us(Mot2[i]);
output_bit(PIN_A3,0);delay_ms(1);
}
}
}
if(input(PIN_B3)==1){
//左モーション
:
Ⅱ-28
==========================================
3.遠隔制御の基礎・・・・指導のヒント
==========================================
目 的
Xportを使用して、ネットワーク経由の制御(遠隔制御)について理解を深めるととも
に、制御方法を習得する。
学習内容
●座学形式では基本的な特徴などを説明し、実際にXPortを使用し、信号機を制御する
ためのプログラムを作成する。
○ 実習ではパソコン間通信でロボットを制御しましたが、制御対象側にパソコンが必要な
た め対象物は常にパソコンと接続しておかなければなりません。これでは制御するの
りは非常に効率が悪いので、小型でイーサネット処理に必要なことが詰まっている
XPORT を使用する。まず、Xportの機能・特徴を座学にて学習します。
○ Xportにはシリアル変換機能と汎用 I/O が3ポートがあるが、今回は汎用 I/O を使
用して信号機やPICとの連携などを学習する。
○ ディバイスサーバにはPICとイーサネットコントローラを使った PICNIC も有る。
10)実習の説明1・・・XPortを使用して信号機の模型を制御する。
処理1)各色のボタンを作成し、ボタンを押した色を点灯させる。
処理2)点滅ボタンを作成し、点灯している色を点滅させる。
処理3)信号機ボタンを作成し、信号機のシミュレーションを行う。
パソコン
(遠隔制御)
イーサネト
ハブ
イーサネト
XPort
デ
入ジ
出タ
力ル
S
S
R
信号模型
XPortのIPアドレス・・・192.168.1.216
ポート番号・・・・・・・・・・30704
◎コントロールコマンドは9バイトのデータを配列の形で与える。
2バイト目・・・変更する汎用I/Oピン
5バイト目・・・変更する値
送信データの領域確保
byte[] send = new byte[9];
送信データの設定
send[0] = 0x1b;
send[1] = 0x07;
:
send[5] = 0x03;
:
send[8] = 0x00;
textBox1
button1
button2
button4
button3
button5
Ⅱ-29
実習1,c#で処理1を行う。(青の点灯)
private void Form1_Load
(object sender, EventArgs e)
:
{
send[0] = 0x1b;
using System.Net;
send[1] = 0x07;
using System.Net.Sockets;
send[2] = 0x00;
send[3] = 0x00;
namespace Xport_client
send[4] = 0x00;
{
send[5] = 0x00;
public partial class Form1 : Form
send[6] = 0x00;
{
send[7] = 0x00;
byte[] send = new byte[9];
send[8] = 0x00;
}
public Form1()
{
}
}
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// ボタン「あお」の処理
TcpClient tc = new TcpClient();
tc.Connect(TerxtBox1.text, 30704);
NetworkStream ns = tc.GetStream();
send[5] = 0x01;
ns.Write(send, 0, 9);
tc.Close();
}
private void button2_Click(object sender, EventArgs e)
{
:
:
実習2、ボタン「あお」「きいろ」「あか」は同じような処理なので、
送信処理 send_cmd()を作成し、button1_Click()~button3_Click()を変更。
private void send_cmd(byte no)
{ TcpClient tc = new TcpClient();
tc.Connect(TerxtBox1.text, 30704);
NetworkStream ns = tc.GetStream();
send[5] = no;
ns.Write(send, 0, 9);
tc.Close();
}
private void button1_Click(object sender, EventArgs e)
{
send_cmd(0x01);
}
private void button2_Click(object sender, EventArgs e)
{
send_cmd(0x02);
}
private void button3_Click(object sender, EventArgs e)
{
send_cmd(0x04);
}
Ⅱ-30
実習3.処理2を行うために button5_Click()と timer1_Tick を作成。
(timer1 は最初 interval=500、Enabled = false)
点滅ボタンはクリックすると点滅し、もう一度クリックすると点灯状態となる。
なお、グローバル変数として byte send5; を宣言。
private void button5_Click(object sender, EventArgs e)
{
//信号点滅 on,off
if (timer1.Enabled == true)
{ timer1.Enabled == false;
}
else { send5 = send[5];
timer1.Enabled == true;
}
}
private void timer1_Tick(object sender, EventArgs e)
{ if (send[5] == send5) { send_cmd(0x00); }
else { send_cmd(send5); }
}
実習4,処理3を行うために button4_Click()と timer2_Tick を作成。
(timer2 は最初 interval=1000、Enabled = false)
なお、グローバル変数として int cnt; を宣言した。
信号は青10秒、黄色3秒、赤10秒、その後青となる。
private void button4_Click(object sender, EventArgs e)
{ cnt = 0;
timer2.Enabled=true; }
private void timer2_Tick(object sender, EventArgs e)
{ if(cnt<10) send_cmd(0x01);
if (cnt>9 && cnt<13) send_cmd(0x02);
if (cnt>12) send_cmd(0x04);
cnt++;
if (cnt==22) { send_cmd(0x01); timer2.Enabled=false; }
}
11)実習の説明2・・・XPort→PICを経由して2軸ロボットを制御
XPortを使用して2軸ロボットNeeBoを制御する。このときNeeBoは直接制御出来
ないため一度PICに信号を送り、その内容によってNeeBoの動作をPICで制御を行うこ
ととする。
処理)モーション番号のボタンを作成し、押したモーションを実行させる。
button1
button2
button3
button4
Ⅱ-31
パソコン側のプログラム
button1_Click()は send[5]に(0x01)を送信, button2_Click()は send[5]に(0x02)を送信
button3_Click()は send[5]に(0x04)を送信, button4_Click()は send[5]に(0x00)を送信
・・・基本的に信号制御プログラムと同じ
PIC側のプログラム
:
void motion(int , int );
int mot[4][8]={{110,190,110,190},{175,125,175,125},
{120,175,120,175},{125,175,125,175},
{120,170,120,170},{175,125,175,125},
{150,150,150,150 },{150,150,150,150}
void main()
{
:
set_tris_a(0x00);
set_tris_b(0x1f);
:
//中立モーション
motion(4);
while(1)
{if( input(PIN_B2) == 1 ) {motion(1);}
else if( input(PIN_B3)) == 1) {motion(2);}
else if( input(PIN_B4)) == 1) {motion(3);}
else { motion(4);}
}
return;
}
//前進
//右
//左
//中立
//前進モーション
//左モーション
//右モーション
//中立モーション
void motion(int mno)
{
int i,j,k;
for( i=0; i<4; i++ )
{for( j=0; j<10; j++ )
{ output_bit(PIN_A2,1);
for( k=0; k<10; k++ )delay_us(mot[mno][i]);
output_bit(PIN_A2,0);delay_ms(1);
output_bit(PIN_A3,1);
for( k=0; k<10; k++ )delay_us(mot[mno][i+4]);
output_bit(PIN_A3,0);delay_ms(1);
}
}
}
●XPortを使用してどのようなことが出来るかを考える。
Ⅱ-32
肩,腰
肩,腰
肩,腰
肩,腰
Ⅲ 情 報 技 術 実 習
1.通信プログラム実習
1)通信プログラムの作成
(じゃんけんゲーム)
2.ポケコンによる制御実習
2)外部入出力ボードの製作
3)ポケコンによる入出力制御
4)ポケコンによる画面表示と制御
3.パソコンによる制御実習
5)VisualBasicによる制御
6)VisualBasicによる画面表示と制御
4.PICによる制御実習
7)PIC制御ボードの製作
8)PICによる入出力制御
9)PICによるDCモータの制御
5.2足歩行ロボット制御実習
10)2足歩行ロボットの制御
(KHR-1+Heart To Heatrt)
11)2足歩行ロボットの遠隔制御
VB19
目的
通信プログラムの作成
簡単な通信プログラムを作成し、通信の仕組・プログラムの特徴を理解する。
基礎知識
○ Winsock コ ン ト ロ ー ル に つ い て
TCP ネ ッ ト ワ ー ク サ ー ビ ス お よ び UDP ネ ッ ト ワ ー ク サ ー ビ ス へ 簡 単 に ア ク セ ス す る
機能を提供するコントロール。
主なプロパティ
Protocol
使 用 す る プ ロ ト コ ル を 指 定 。 0= TCP 1= UDP
Localport 自 分 の PC の ポ ー ト 番 号
Remoteport 相 手 の PC の ポ ー ト 番 号
Remotehost 相 手 の IP ア ド レ ス 。 DNS が 使 用 で き る 場 合 は PC 名 で も 可 。
State
コ ン ト ロ ー ル の 状 態 。 0=Close 1=Open 2=Listening …
6=Connecting 7=Connected 8=Closing 9=Error
主なメソッド
Accept
TCP サ ー バ で 使 用 。 接 続 要 求 を 受 け 入 れ る と き に 実 行 す る 。
Close
接続または接続要求を受け付けているソケットを閉じる。
GetData
バッファよりデータを取得する。
Listen
ソケットを作成し接続要求を受け付けるモードに移行する。
SendData
データをリモートコンピュータへ送信する。
主なイベント
ConnectionRequest TCP サ ー バ に 接 続 要 求 が 送 ら れ て き た 場 合 に 発 生 。
DataArrival
新しいデータが送られてきたときに発生。
Error
処理・送受信に失敗した場合に発生。
Close
リモートコンピュータが接続を閉じたときに発生。
○ TCP 通 信 の 流 れ
コネクション
データ通信
DataArrivalイベント
& GetDataメソッド
データ
SendDataメソッド
Ⅲ-1
実習で作成するプログラム内容
「 Winsock オ ブ ジ ェ ク ト を 使 っ た 通 信 プ ロ グ ラ ム で 、 じ ゃ ん け ん ゲ ー ム を 作 成 す る 。」
詳細
対戦相手と自分の手を通信によりデータ交換し、各自で勝敗を判定して画面表示する。
注意点:サーバ・クライアントの違いを両方こなせるプログラムに仕上げること。
プログラム実行の流れ(一例)
サーバとしての実行の流れ
クライアントとしての実行の流れ
ポート・プロトコル設定
↓
Listen 実 行
↓
ConnectionRequest 待 ち
↓
Accept を 返 す
↓
自分の手の決定
↓
DataArrival 発 生
↓
GetData 実 行
↓
判定
↓
結 果 表 示 と SendData
↓
Close 処 理
ポート・プロトコル設定
↓
サ ー バ IP ア ド レ ス 設 定
↓
Connect 要 求
↓
自分の手の決定
↓
SendData で 送 信
↓
DataArrival 発 生
↓
GetData で 結 果 を 受 信
↓
結果表示
↓
Close 実 行
状 態 (State)変 移 図
0
Connect
自動
2
Accept
6
自
動
8
Ⅲ-2
7
9
DataArrival
GetData
SendData
参 考 :「 Winsock を 使 っ た TCP チ ャ ッ ト プ ロ グ ラ ム 」
(VisualBasic
Ver.6)
クライアント
'ク ラ イ ア ン ト 側 プ ロ グ ラ ム
Private Sub Command1_Click()
'接 続 ボ タ ン
Winsock1.Connect
End Sub
Private Sub Command2_Click()
'送 信 ボ タ ン
Winsock1.SendData (Text2.Text)
End Sub
Private Sub Command3_Click()
'開 放 ボ タ ン
Winsock1.Close
End Sub
Private Sub Winsock1_Close()
'Close 受 信
Winsock1.Close
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim Str As String
'Data 受 信
Winsock1.GetData Str
Text1.Text = Str
End Sub
Ⅲ-3
サ ー バ
' サーバ側 プログラム
Private Sub Command1_Click()
Winsock1.Close
Text3.Text = ""
End Sub
Private Sub Command2_Click()
Winsock1.SendData Text2.Text
End Sub
Private Sub Form_Load()
Winsock1.Listen
End Sub
Private Sub Winsock1_Close()
Winsock1.Close
Text3.Text = ""
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If Winsock1.State <> sckClose Then Winsock1.Close
Winsock1.Accept requestID
Text3.Text = Winsock1.RemoteHostIP
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim Str As String
Winsock1.GetData Str
Text1.Text = Str
End Sub
Ⅲ-4
● 「じゃんけん」プログラム例
Dim MH, EH As Integer 'MH-自 分 の 手 EH-相 手 の 手
P r iv a t e S u b C o m m a n d 1 _ C l ic k ( ) ' グ ー
MH = 1
Wi n so c k 1 . S e n d D a t a M H
If Te x t 2. Te x t = " 勝 負 " T h e n
Te x t 2. Te x t = " 相 手 待 ち "
Else
Call Hantei
En d I f
En d Su b
P r iv a t e S u b C o m m a n d 2 _ C l ic k ( ) ' チ ョ キ
MH = 2
Wi n so c k 1 . S e n d D a t a M H
If Te x t 2. Te x t = " 勝 負 " T h e n
Te x t 2. Te x t = " 相 手 待 ち "
Else
Call Hantei
En d I f
En d Su b
P r iv a t e S u b C o m m a n d 3 _ C l ic k ( ) ' パ ー
MH = 3
Wi n so c k 1 . S e n d D a t a M H
If Te x t 2. Te x t = " 勝 負 " T h e n
Te x t 2. Te x t = " 相 手 待 ち "
Else
Call Hantei
En d I f
En d Su b
記憶用変数
ボタン
ボタン
ボタン
P r iv a t e S u b Win s o c k 1_ D a t a A r r iv a l
( By Va l by t e s To t a l A s L o n g )
Wi n so c k 1 . G e tD a t a EH
If Te x t 2. Te x t = " 勝 負 " T h e n
Te x t 2. Te x t = " こ ち ら 待 ち "
Else
Call Hantei
En d I f
En d Su b
'通 信 開 始 ボ タ ン
P r iv a t e S u b C o m m a n d 4 _ C l ic k ( )
Wi n so c k 1 . C l o se
Wi n so c k 1 . C o n n e c t
Te x t 2. Te x t = " 勝 負 "
En d Su b
P r iv a t e S u b H an t e i ( ) ' 判 定 ~ 結 果 表 示
Te x t 1. Te x t = E H
If MH = EH Then
Te x t 2. Te x t = " あ い こ "
E l s e If M H = 1 A n d E H = 2 T h en
Te x t 2. Te x t = " 勝 ち "
E l s e If M H = 2 A n d E H = 3 T h en
Te x t 2. Te x t = " 勝 ち "
E l s e If M H = 3 A n d E H = 1 T h en
Te x t 2. Te x t = " 勝 ち "
Else
Te x t 2. Te x t = " 負 け "
En d I f
En d Su b
'再 戦 ボ タ ン
P r iv a t e S u b C o m m a n d 5 _ C l ic k ( )
Te x t 2. Te x t = " 勝 負 "
En d Su b
' 初 期 Re m o t e H o s t & P o r t は フ ゚ ロ パ テ ィ 直 設 定
P r iv a t e S u b F o r m _ L o a d ( )
Wi n so c k 1 . C l o se
Wi n so c k 1 . L i s t en
En d Su b
P r iv a t e S u b Win s o c k 1
_ Co n n ec t i o n R e qu e s t ( B y Va l r e qu e s t ID A s Lo n g )
If Win s oc k 1 . S t a te < > s c k C lo s e Th e n Win s oc k 1. C l o se
Wi n so c k 1 . A c c e p t r e q u e s t I D
Te x t 2. Te x t = " 勝 負 "
Beep
En d Su b
Ⅲ-5
H300
目
外部入出力ボードの製作
的
外部出力を用いて様々な制御を行うために、端子の仕様より装置を作成する方法を理解する。
基礎知識
(1)
LED(発光ダイオード)
LED は順方向に電流を流すことによって発行するダイオードで、約2V の電圧降下があるの
で 1.5V の電池で点灯させることは出来ません。また、直接電圧を加えると過大な電流が流
れるため、必ず直列に抵抗を入れます。
(2) 抵抗
ディジタル回路において抵抗は、主にプルアップ・プルダウン抵抗(IC の入力電圧を安定さ
せる為の抵抗)として用いられます。また、トランジスタやダイオードに流れる電流を制限
する為に用いられることもあります。
普通抵抗は 4 本のカラーコードによって抵抗値を表します。
0
1
2
3
4
5
6
7
8
9
黒
茶
赤
橙
黄
緑
青
紫
灰
白
(3) ポケコン PC-G850 の11ピンインタフェース仕様
別紙仕様書参照
製作するボード仕様
出力
LED×7(横一列に配置)
信号線0~6の出力に対応
入力
スイッチ×1
信号線7への入力に対応
端子
ポケコン11ピンインタフェース
保護抵抗
1.0kΩ×8
各 LED とスイッチに直列接続
回路図
Ⅲ-6
参考資料
実体配線図
Ⅲ-7
H301
目
的
ポケコンによる入出力制御
標準入出力装置以外の装置とデータをやりとりする方法を、
ポケコンとI/Oカードを使用して実践し理解する。
基礎知識
(a)
SHARP製ポケットコンピュータ
PC-G850V
について
PC-G850Vには本体左に11ピン端子があり、この端子はシリアル・8ビット
パラレルなどの入出力を行うことが出来る。また、様々な外部機器を接続することも
できる。
(b)
マイクロI/Oカードについて
入力4ビット・出力4ビットの回路を内蔵してい
る他、外部に8ビット出力、もしくは4ビット入
力と7ビット出力ができるようになっている。汎
用入出力端子として安全に利用できるよう工夫さ
れている。今回の実習では、4ビット入出力モー
ドでI/Oカードのみを使用する。
内蔵の 4 ビット入出力は、8ビットパラレル信号
の上位 4 桁を入力、下位 4 桁を出力に設定し使用する。
(c)
外部装置に関する注意事項
取り付け時
・ポケコンの電源をOFFの状態で装着・接続する。
・外部電源を使用する場合、必ずポケコンより先に電源を入れる。
取り外し時
・ポケコンの電源をOFFする。
・外部電源をOFFした後、取り外す。
(d)
ミニI/Oに関するBASIC命令
<ポケコン PC-G850 専用命令>
①OPEN命令
出力デバイスを指定する。PIO,SIOなど指定によって信号も変化する。
例
OPEN
”PIO:”
←パラレルI/Oの準備
②PIOSET命令
ミニI/Oで 8 ビット制御を行うために各信号の入出力モードを指定する。
ビット単位で入力・出力の設定が可能で、入力は1・出力は0と設定する。
例
PIOSET
&HFF
←全ビットを入力に設定
③PIOPUT命令
出力ポートへの出力命令。0~255の値をPIOSET命令で出力モードに
指定した端子より出力させる。入力に指定した端子は無視される。
例
PIOPUT
&H2B
←00101011 の信号を出力
④PIOGET命令
入力ポートへの入力命令。0~255の値をPIOSET命令で入力モードに
していした端子より読み取る。出力に指定した端子は0を返す。
例
SW=PIOGET
Ⅲ-8
←読み込んだ値を変数SWに代入。
(e)
プリンタインタフェースを使用した印刷
・プリンタインタフェースを接続し、電源を入れる
・RUNモードで
・
OPEN ”LPRT:” を実行し、プリンタポートを用意。
LLIST を実行し、リストを印刷する。
注意:カタカナはプリンタとのコードが一致せず文字化けする為、使用しないこと。
実習内容
例題1
右端のLED1つを点灯させる。
・・・(ミニI/Oを使用して)
START
外部出力
設定
10
OPEN
20
PIOSET
30
PIO
40
STOP
50
END
データ
出力
END
例題2
スイッチのどれかがONになったとき、値を画面に表示する。
(・・・ミニI/Oを使用して)
START
外部出力
設定
データ
読み込み
Y
10
OPEN
20
PIOSET
30
入力なし
N
=
40
IF
50
PRINT
60
STOP
70
END
PIO
THEN
30
値を表示
END
問題1
LEDを○●○●と点けなさい。○は点灯●は消灯とする。
(・・・ミニI/Oを使用して)
問題2
スイッチをONにすると、その場所に対応するLEDが点灯するようにしなさい。
(・・・ミニI/Oを使用して)
Ⅲ-9
この問題以降は自作 I/O ボードを使用して行う。
(入出力モード PIOSET の確認)
問題3
LED全てを点滅させなさい。
注:点滅が高速すぎると人の目には「点灯」と
しか見えないので、適当な空ループを作って、
時間調整をすること。
問題4
論理演算XORを用いて、LEDを点滅させなさい。
ただし、初期状態でどこか2つのLEDが点灯しているものとする。
問題5
光が右から左へ流れるように1つのLEDを点灯させなさい。
点灯しているLEDが左端まで行った場合、右に戻して繰り返すこと。
START
1
外部出力
設定
カウントを
増やす
2
カウンタの初期化
左端まで
移動?
データ
出力
N
Y
カウンタの初期化
時間稼ぎ
空ループ
2
1
問題6
LEDを右から左、左から右と往復を続けるようにしなさい。
Think:LED を右から左へと続け、SW が押されたら反転(左から右)する。
もう一度押されたら再び反転する。
レポート内容
・目的
・問題1~6
問題文とリストおよび流れ図
・まとめ
外部装置とのデータ入出力の方法について
・反省、感想
Ⅲ-10
H302
目
的
ポケコンによる画面表示と制御
制御状態を画面に表示する方法を理解し、使いやすい制御プログラムを学習する。
基礎知識
(a)
ポケコンの画面座標
→
X
座
標
↓
|
Y
|
座
-----+
標
任意の位置にカーソルを持っていくBASIC命令は
LOCATE
左上隅は
(b)
X座標
LOCATE
,Y座標
0,0
である。
である。
特殊キャラクタの画面表示
キャラクタコード表にある記号を表示するには、CHR$命令を用いる。
たとえば「●」を表示する場合は、
PRINT
CHR$(&HEC)
(参考)ミニI/Oに関するBASIC命令
とすれば、画面に表示される。
<ポケコン PC-G850 専用命令>
①OPEN命令
出力デバイスを指定する。PIO,SIOなど指定によって信号も変化する。
例
OPEN
”PIO:”
←パラレルI/Oの準備
②PIOSET命令
ミニI/Oで 8 ビット制御を行うために各信号の入出力モードを指定する。
ビット単位で入力・出力の設定が可能で、入力は1・出力は0と設定する。
例
PIOSET
&HFF
←全ビットを入力に設定
③PIOPUT命令
出力ポートへの出力命令。0~255の値をPIOSET命令で出力モードに
指定した端子より出力させる。入力に指定した端子は無視される。
例
PIOPUT
&H2B
←00101011 の信号を出力
④PIOGET命令
入力ポートへの入力命令。0~255の値をPIOSET命令で入力モードに
していした端子より読み取る。出力に指定した端子は0を返す。
例
SW=PIOGET
←読み込んだ値を変数SWに代入。
(参考)プリンタインタフェースを使用した印刷
・プリンタインタフェースを接続し、電源を入れる
・RUNモードで
・
OPEN ”LPRT:” を実行し、プリンタポートを用意。
LLIST を実行し、リストを印刷する。
注意:カタカナはプリンタとのコードが一致せず文字化けする為、使用しないこと。
Ⅲ-11
実習内容
基礎問題1
X座標
5、Y座標
2の位置に◆を表示するプログラムを作りなさい。
基礎問題2
下のように画面表示されるようにプログラムを作りなさい。
○
○
○
○
(注)For~NextとLocateを使いX座標の位置を変えて表示すること。
基礎問題3
下図のように画面で5回右端が点滅するようにプログラムを作りなさい。
○
I=1 TO 5
J=1 TO 4
○
○
○
↑
↓
○
○
○
●
(注)状態表示用配列をつくり、内容によって●と○のどちらを
表示するか切り替え、ループを利用して表示する。
HYO(J)=0
NEXT J
表示
時間稼ぎ
HYO(4)=1
表示
時間稼ぎ
NEXT I
Ⅲ-12
問題1
基礎問題3の動作が画面で表示され、かつ同様の動作がI/OボードのLEDでも
行われるようにプログラムしなさい。
問題2
スイッチを入れた所のLEDが点灯し、かつ下図のように画面表示するようにしなさい。
○
○
●
○
○
○
○
○
_
_
■
_
スイッチをおろすと _
_
_
_
となる。
問題3
右端のスイッチを上げると右から左へ、左端のスイッチを上げると左から右へLED
の光が移動し、画面表示もそのようになるようにプログラムをつくりなさい。
尚、端に光が到達した場合は、その場にとどまっているものとし、
移動中にスイッチをおろした場合、その場所に停止するものとする。
○
○
○
●
_
_
_
■
↓
○
○
●
○
_
_
_
■
↓
○
●
○
○
_
_
_
_
↓
○
●
○
○
■
_
_
_
↓
○
○
●
○
■
_
_
_
レポート内容
・目的
・問題1~3
問題文とリスト
・まとめ
制御状態を画面表示する方法について
・反省、感想
Ⅲ-13
H303
Visual Basicによる制御
○目的
標準入出力装置以外の装置から入出力する方法を、USB-IOボードとVBを使用して理解する。
○基礎知識
(a)
USB(Universal Serial Bus)
周辺機器とパソコンを結ぶデータ伝送路の規格のひとつ。USB 1.1 は最高で 12Mbps(=1.5MB/s)。
USB 2.0 での転送モードは LS(Low Speed)1.5Mbps、FS(Full Speed)12Mbps、HS(High Speed)480Mbps。
(b)
USB-IO ボード
(有)テクノキット製
ベンダーID【0x12ED】製品 ID【0x1003】
USB の標準 HID(Human Interface Devices)として認識するため、挿すだけで認識する。
4ビットと8ビットの2つのポートを持ち、それぞれ入力・出力を切り替えることができる。
(c) インバータボード
(有)テクノキット製
USB-IO と一体化したものを使用
IC[74HC04]2個で 12 ビット 20mA の安定した出力を取り出せるようにしたもの。
また、IO からの信号レベルを反転し、コンピュータ信号と制御機器の動作を一致(1を出力する
と LED 点灯等)させてある。インジケータ LED として8個と4個の2色の LED を付けてある。
入力としては1番ポートを入力に変えることにより4ビット入力が可能。コネクタには0番と
1番の2つのビットが接続されている。
Ⅲ-14
(d)
USB-IO の使用方法
USB-IO の接続と認識
→
命令の定義
→
データ転送(入出力処理)
(e) 命令の定義について
この USB-IO の入出力については、製造元や利用者より DLL がフリーで配布されている。
今回の実習では、vbausbio.dll というファイルを利用することにより、以下の命令を使用する。
*** vbausbio.dll によって定義されている命令 ***
○uio_find …
USB-IO の検索・初期化命令。
宣言 Declare Function uio_find Lib "vbausbio.dll" () As Long
使用
uio_find()
戻り値 0:正常、1:必要なドライバが無い、2:USB-IO が繋がってない
○uio_inp … USB-IO よりデータを取得する。
宣言 Declare Function uio_inp Lib "vbausbio.dll"
(ByRef InpDat As Byte, ByVal Port As Long, ByVal p3 As Long) As Long
使用
uio_inp(値を記憶する変数,ポート番号[0 か 1],0,パルスの有無[0(無)か 1(有)])
戻り値 0:正常、1:命令が書けなかった、2:データを取得できなかった
○uio_out() … USB-IO にデータを出力する。
宣言 Declare Function uio_out Lib "vbausbio.dll"
(ByVal Port As Long, ByVal OutDat As Long, ByVal p3 As Long) As Long
使用
uio_out(ポート番号[0 か 1],出力データ[0~255],パルスの有無[0(無)か 1(有)])
戻り値 0:正常、1:異常
○uio_free() …
USB-IO を開放する。
宣言 Declare Function uio_free Lib "vbausbio.dll" () As Long
使用
uio_free()
戻り値 0
○uio_getdevs() … 接続されている USB-IO の数を調べる。
宣言 Declare Function uio_getdevs Lib "vbausbio.dll" () As Long
使用
uio_getdevs()
戻り値
個数
○uio_seldev() … 使用する USB-IO を切り替える。
宣言 Declare Function uio_seldev Lib "vbausbio.dll" (ByVal p1 As Long) As Long
使用
uio_seldev(番号[0~uio_getdevs で得た個数-1])
←0番から始まることに注意
戻り値 0
uio_find を実行しなくても初めて uio_inp/out を実行するときには自動的に uio_find が呼ばれます。
ただし、最初だけなので USB-IO が一度外されてもう一度挿された場合などは無視されます。
Ⅲ-15
(f)
DLL(Dynamic Link Library)とは
Windows において、複数のアプリケーションソフトが共通して利用するような汎用性の高いプログ
ラムを部品化してファイルとして保存しておき、必要に応じてメモリに呼び出して利用する手法。ま
た、そのようにして利用されるプログラム部品のこと。
Windows は OS としての機能の多くを DLL として提供しており、基本的なアプリケーションソフトな
らば標準の DLL が持つ機能を呼び出すだけで構築できることも多い。
VisualBasic から呼び出す場合、標準では Windows システムフォルダ内の system32 フォルダの中
に使用する DLL が存在する必要がある。
(g) VBでの制御プログラムの注意点
VisualBasic で永久ループを使うと、終了しない処理を早く終わらせる為に、Windows は CPU 使用
率を変化させる。この動作によってVBに使われる使用率が増大していき、最終的に他の動作ができ
なくなる。この現象を回避するには、一定以上処理負荷がかからないようしなくてはならない。
○実習内容
開始
例題1
確認事項
インバータボードLEDの00番だけを点灯させなさい。
・使用する命令の選別
命令
定義
・命令の定義方法(private 定義)
・出力値と位置の関係
ポートへ
データを
送信
終了
例題2
確認事項
インバータボードのLED全てを点滅させなさい。
・時間制御の方法
LED=0
・出力値の切り替え方
・反応速度と時間間隔
N
LED=0
LED=0
LED=255
LEDの値
を送信
Ⅲ-16
Y
問題1
下図のような形で点滅するようにしなさい。
○●●○
●○●○●○●○
⇔
●○○●
○●○●○●○●
(●は点灯)
問題2
0番ポートの0~7を光が移動するようにしなさい。
○○○○○○○● → ○○○○○○●○ → ○○○○○●○○ ・・・
0の7番まで移動した後は、0の0から再度移動するようにすること。
問題3
0番ポート0~7に続き1番ポート0~3を光が移動するようにしなさい。
問題2と同様1番ポート3番まで移動した後は、0番ポート0番から再度移動すること。
問題4
30秒を1サイクルとするカウンタを、次の仕様に基づいて作成しなさい。
1番ポート(黄色)
○
○
0番ポート(赤色)
○
○
○
○
○
○
○
○
○
○
10 20 10
9
8
7
6
5
4
3
2
1
10 秒ごとの
0~10秒のカウント
カウント
①右から 1 秒ごとに LED の点灯が増えていき、10 秒で黄色の右2個と赤の全てが点灯する。
②11 秒になると黄色の左端1個と赤右端1個の点灯で 11 秒を表し、同様に光が増えていく。
③20 秒では左より2個目以外全て点灯、21 秒では左2個と右端1個が点灯となる。
④30 秒で全点灯となり、次の表示は 1 秒目へ戻って繰り返す。
(次回実習)
VisualBasic による制御
「VBでの画面表示と制御」
(次回レポート予告)
・表紙
・目的
・基礎知識(USB・外部入出力方法・DLL・画面表示について、自分なりにまとめて書く)
・問題とポイント(問題文を書いた下に、問題解決のポイント、プログラムの要点を書く)
・問題のコード(用紙に問題番号は明記すること)
・感想
Ⅲ-17
H304
Visual
Basicによる画面表示と制御
前回使用した USB ボードと vbausbio.dll を使用して、画面表示とボード出力を同時に制御する。
フォームデザイン
上のようにフォームをレイアウトする。
このとき8個と4個の LED はそれぞれコントロール配列にし、INDEX が右から0、1、2…とする。
○
○
○
○
○
○
○
○
○
○
○
○
3
2
1
0
7
6
5
4
3
2
1
0
Index
画面表示は配置されたコントロール配列の内容に、色 LED のデータをコピーするという方法で行うた
め、フォーム内に使用する各 LED を別々に配置しておき、実行時に非表示になるように設定する。
○画面表示の変更方法
例題3
1番ポート右端の LED を点滅させなさい。
問題5
0番ポート8個の LED を点滅させなさい。
問題6
赤の LED が右端から左端まで流れる動作を繰り返しなさい。
問題7
0番ポート8個に引き続き1番ポート4個の LED に、右から順に光が増えるようにしなさい。
問題8
全ての LED を使って、1つの光が往復運動を行うようにしなさい。
---(レポートについて)-------------------------------
・表紙
・目的
・基礎知識(USB・外部入出力方法・DLL・画面表示について、自分なりにまとめて書く)
・問題とポイント(問題文を書いた下に、問題解決のポイント、プログラムの要点を書く)
・問題のコード(用紙に問題番号は明記すること)
・感想
Ⅲ-18
H401
PIC制御ボードの製作
1. 目的
PICを使った制御ボード(CPUボード)を作成し、ワンチップマイクロコントローラの概要を理解する。
2. 基本事項
<PICとは>
PIC(Peripheral Interface Controller)はその名前の由来どおり、コンピュータの周辺に接続される周辺機器
との接続部分を制御するために開発された「マイクロコントローラ」と呼ばれる領域の IC です。つまり、それ
ほど高機能、高速性は必要としないが、周辺機器を制御するのに便利な機能は内蔵しているといった、使
用目的が比較的明確な範囲に限られているマイクロコンピュータの一種です。
<PIC の概要>
①小型であるが最新の RISC アーキテクチャ
②電池動作ができる
③入出力ピンは入出力自由で直接発光ダイオードやリレーが駆動できる
④低価格である
⑤メモリも入出力回路もみんな1個のICに入っている・・・・従来のコンピュータにはない
PIC には、右の写真のように目的に合わせて数多く
の種類があります。 わずか8ピンの小さな IC の中に、
マイクロコンピュータとしての機能が一通り納まってい
るものから、数多くの周辺機能を内蔵し、パッケージも
40 ピンや 64 ピンもある大型のタイプまで用意されてい
ます。
<外部構成(ピン構成)と内部構成>
図1は PIC16F84のピン構成である。18ピンのなかで電源とクロック関連ピンをのぞいた大部分が入出
力ピンである。この入出力ピンは入力にも出力にも自由に設定して使うことができるので、いろいろなもの
を動かすときには非常に便利に使うことができる。
OSC1/CLKIN : 発振クリスタル入力
外部クロック入力
OSC2/CLKOUT : 発振クリスタル出力
クロック出力の場合には OSC1 の 1/4 の
周波数
MCLR(inv) : マスターリセット入力
L レベルでリセット状態
RA0 - RA3 : 入出力ポート
RA4/T0CKI : 入出力ポート
タイマー(TMR0)のクロックパルス入力
RB0/INT : 入出力ポート
外部割り込み信号入力ポート
RB1 - RB7 : 入出力ポート
VSS : 接地
VDD : 電源入力(+2.0V ~ +5.5V)
Ⅲ-19
図は PIC の内部構成を簡単に表したものである。
図 マイコンの構成
No 略号
名称
1 RAM
リード/ライト可能メモリ
2 ROM
リードオンリメモリ
3 CPU
4 タイマ
機能内容
書込みも読み出しも可能なメモリで
主にデータ格納用として使われる。
読み出し専用のメモリで、主にプログラム
格納用として使われる。
マイコンの心臓部で、命令の解読実行と
中央処理部
タイマ、カウンタ
各種演算を行う。
時間間隔を作ったり、外部信号パルスを
カウントしたりするためのハードウェア回路部。
外部と入力/出力を行うための信号ラインで
5 I/O PORT 入出力ポート
直接外部回路と接続してプログラムにより
On/Off の制御を行う。
6 INT
Interrupt
外部事象により、プログラムに強制的に割込む
割込み制御
信号を発生する。
7 CLOCK
クロック発振回路
8 BUS
データバス
9 BUS
プログラムバス
マイコンを動かすための基本タイミング信号を
作るのと、各種タイミング制御を行う。
データ専用の通り道で、高速な転送が出来る
様に8ビットの並列で信号を転送する。
命令を転送するための専用の通り道で、高速転送が
出来るように、14ビット並列で転送する。
Ⅲ-20
3.回路設計の実際(PICユニバーサル基板を使用)
実際に自作のPICを使ったハードウェアを作ります。作る回路は
LED(発光ダイオード)を PIC から直接ドライブして点灯/消灯ができる(RA1)。
入力用にタクトスイッチを付ける(RB0)。
前回作成した制御対象基板が接続できようにする(RB1~RB7)。
サーボモータ制御用の端子を付けておく(RA2,RA3)。
これを使ってPICを初めて動かすための「LED点滅回路」を例題とします。
PICはかなり大電流を直接 ON/OFF することが出来ます。どれぐらいかというと、各ピン当たり25mA の引込み
が最大となっています。発光ダイオードはせいぜい 10mA も流せば明るく光りますので十分です。
5V の電源で 10mA を流すには、LED での電圧降下が約 1V ぐらいですから(4V-0.6V)/10mA=340Ω ということ
で約300~500Ω ぐらいですが大きめの1Kの抵抗をLEDに直列に挿入してPICの出力ポートにつなぎます。
出力ポートはPICの場合プログラムで自由に決められますから、今回は PORTA の RA1 を接続します。
あとは、20MHz のセラミック振動子(水晶振動子は高価なので)をOSC1,OSC2に接続する。
リセット端子(MCLR)には抵抗でプルアップして 5V がかかるようにします。
電源回路は3端子レギュレータ7805で 5V の定電圧を作ります。このレギュレータの前後に
電解コンデンサ(47~100uF)を付けます。極性があるので取り付けには注意して下さい。
Ⅲ-21
4.プルアップ/プルダウン
『閉じたり開いたりするスイッチ』を使って"1"あるいは"0" を入力す
る際 、 入力ピンは開放状態にならないようにするように注意しま
す。具体的には右のような回路にする。
•
スイッチが閉じているときには、入力ピンは グランドとショ
ートするので、Vcc に継っている抵抗器は無視されます。したがって入力は"0"になる。
•
スイッチが開いているときは入力ピンは大きめの抵抗器を経由して Vcc に継っている。ここでディジタ
ル IC の入力ピンにはほとんど電流が 流れないという特性がある。すなわち図中の抵抗を流れる電流
はほとんど 0 A とみなしてさしつかえない。すると電圧降下=電流×抵抗というオームの法則より 電圧
降下はほとんど 0 V、したがって入力ピンにかかる電圧はほとんど Vcc、つまり"1"が入る。
•
仮に Vcc に継っている抵抗がなかったとして、スイッチが開いているとすると 入力ピンがどこにも継ら
ない「宙ぶらりん状態」になってしまう。すると IC の中の複雑な事情により、"0"か"1"が決まらない場
合が多い。『入力ピンを宙ぶらりんにしない』 はディジタル IC の基本なのです。
このようにスイッチが開放状態のときに入力を安定させるのに使う抵抗 (など)を『プルアップ抵抗』(Vcc に繋げ
る場合)あるいは『プルダウン抵抗』(GND に繋げる場合)という。
5.組み立て方の実際
組み立ては基板は出来あがっているので、部品を配置して半
田付けという作業になります。部品では電源(電池)との接続
に電源用コネクタを使います。PIC と電源周りはプリント板で
配線済みですから、発光ダイオードとタクトスイッチを適当なス
ルーホールに固定し配線します。
①PIC 周りのコンデンサ、
電源レギュレータ関連
の配置と配線です。
③PIC用OCソケッ
トとセラミック発信子
です。ICソケットの向
②LED、スイッチ サー
きに注意。
ボ端子の配置と配線で
す抵抗をうまく使って配
線をします。
④拡張用端子とBポートを接続します。
Ⅲ-22
H402
PICによる入出力制御
1. 目的
PIC による制御1で製作したハードウェアを動作させるプログラムを作成することを通して、ワンチップマイク
ロコントローラのプログラミングについて理解を深める。
2. 基本事項
【開発環境として必要なもの】
下の図が開発に必要な最低限の道具です。
PICは開発環境として必要なものが少なく、
しかも簡単に安く揃えられるのでアマチュア
工作には最適です。環境はPICシリーズのほ
とんどに共通です。以下順に必要なものを説明していきます。
(1) プログラム開発用ハードウェア
(a) パソコン
(b) PIC ライタと電源
パソコンとつないでプログラムをPICに直接書き込む道具です。
(c)ターゲットマシン(製作品)
実際に動作させるハードウェア、これを製作するのが目的。
(2) プログラム開発用ソフトウェア
(a) MPLAB
プログラムを開発するための統合開発環境ツールで、プログラムの作成編集、アセンブル、シミュレ-
ションデバッグと、ひとつでみんな出来てしまう優れものです。
(b) PIC ライタプログラム
パソコン上で使うもので、MPLAB で開発したプログラムそのものを、PIC の内蔵プログラムメモリに転
送し書き込むためのソフトウェアです。
Ⅲ-23
3.プログラム開発
ハードウェアを考慮してプログラムの全体の流れを考える
フローチャート・コーディングを書く
↓
①ディスクトップ上の MPLAB を起動し、Project Wizardを起動する
②使用するPIC(今回は16F84A)を選択し次へ
③開発する言語を選択し、同時にコンパイラプログラム(今回はCCSーC)を指定する
④プロジェクト名と作成する場所を指定する。(基本的にマイドキュメントにPICフォルダを作成)・・・日本語不可
Ⅲ-24
⑤すでに作成してプログラムを使用するときのみ追加(Add)する。新規の場合は次へ・・・設定終了
⑥プログラムの作成
ファイルより新規(new)を選び、作成画面が出てきたらファイル名を付けて保存をする。
保存場所はプロジェクトと同じ場所とする。
u:\pic\ファイル名.c
⑦ソースプログラムをプロジェクトに参加させる
④プログラム入力が終わったら、実際にコンパイルを行う
Ⅲ-25
PIC にプログラムを書き込む
PIC ライタを使って、PIC にプログラムデータを書き込む
①PIC ライタとコンピュータをシリアルケーブルで接続する
②ACアダプタをライタに接続し、PIC ライタの LED が点灯するのを確認する
③PIC を PIC ライタに装着する。レバーを上げて PIC のピンの位置を確認して置きレバーを下げる
u:\pic>ファイル名.hex
PIC をハードウェアにセットして実行する
自分が作った回路に PIC をセットし、電池を接続し動作を確認する
Ⅲ-26
4.実習内容 ・・・(注意:PICを接続してから、電池を接続する。はずすときは電池から)
実習1:RA1に接続しているLEDを10回点滅させる。
実習 2:別基板の複数のLED7個を10回点滅させる。
実習 3:別基板の複数のLED7個を交互に回点滅させる。
○
●
○
●
○
●
○
●
○
●
○
●
○
↓
●
○
●
○
↓
○
●
○
●
実習 4:別基板の複数のLED7個を順番にシフトさせる。
○
○
○
○
○
○
●
↓
○
○
○
○
○
●
○
↓
○
○
○
○
●
○
○
↓
○
○
○
●
○
○
○
↓
○
○
●
○
○
○
○
↓
○
●
○
○
○
○
○
↓
●
○
○
○
○
○
○
↓
実習 5:電池を入れて、スイッチを押すと数秒後にシフト(実習4)スタート
実習 6:電池を入れて、スイッチを押すとシフト(実習4)スタート、その後スイッチを押すと
RA1に接続されているLEDを10回点滅させ、数秒後シフトを最初からスタート
実習 7:電池を入れて、スイッチを押すとシフト(実習4)スタート、その後スイッチを押すと
反対にシフトスタート、その後スイッチを押すと反対にシフトスタート・・・
Ⅲ-27
<<CCS-Cの命令(抜粋)>>
#include <16F84A.h> // チップ PIC16F84Aを選ぶプリプロセッサコマンド
#fuses HS,NOWDT,NOPROTECT,NOLVP // チップのためにヒューズを定義するプリプロセッサコマンド
#use delay(clock=20000000) // クロック速度を指定するプリプロセッサコマンド
DELAY_MS()
構文:delay_ms(time)
パラメータ:time は変数 0~255、又は、定数 0~065535
機能: time ミリ秒のディレイをいれます。
time には、定数であれば0~65535 まで入力できます。また、変数ならば0~255 となります。
サンプル:#use delay( clock=20000000 )
delay_ms( 2 ); // 2mS 待ち
void delay_seconds( int n ){ // n 秒待ちルーチン
for (;n!=0; n- -)
delay_ms( 1000 );
}
DELAY_US()
構文: delay_us(time)
パラメータ:time は変数 0-255、又は、定数 0-65535
機能: timeμ 秒のディレイをいれます。
time には、定数であれば0~65535 まで入力できます。また、変数ならば0~255 となります。
INPUT()
構文:value=input(pin)
パラメータ:pin で指定されたピンの状態を読み込みます。
戻り値:pin がローの場合は0(又は、FALSE)、pin がハイの場合は1(又は、TRUE)
機能: 示されたピンの状態を返します。
サンプル:while ( ! input( PIN_B1 ) ); //ハイへB1 を待ちます。
if( input(PIN_A0) ) printf(“A0 is now high¥r¥n”);
OUTPUT_BIT()
構文: output_bit(pin, value)
パラメータ:pin は各デバイスのヘッダー・ファイル(*.h)で定義されています。
Value は1 又は、0
機能: 指定されたピンpin にvalue(0 か1)を出力します。
サンプル: output_bit( PIN_B0, 0 ); // output_low(PIN_B0)と同じ
OUTPUT_A(), OUTPUT_B()
構文: output_a(value)
/
output_b(value)
パラメータ:value は8bit 整数
機能: ポートからの全バイトを出力。
サンプル: OUTPUT_B(0xf0);
OUTPUT_HIGH ()
構文: output_high(pin)
パラメータ:pin で指定されたピンの状態を読込みます。
機能: 与えられた出力ピンpin をハイレベル(ほぼ電源電圧)にします。
サンプル:output_high( PIN_A0 );
Ⅲ-28
OUTPUT_LOW ()
構文: output_low(pin)
パラメータ:pin は各デバイスのヘッダー・ファイル(*.h)で定義されています。
機能: 与えられた出力ピンpin をローレベル(0V)にします。
サンプル:output_low( PIN_A0 );
SET_TRIS_A(), SET_TRIS_B()
構文: set_tris_a(value) / set_tris_b(value)
パラメータ:value はI/O ポートのビットを現す各ビットの8bit の整数
機能: トライステート(3's ステート)レジスタの設定を行ないます。
設定される数値はそれぞれのビットに対応した数値で、1を与えると入力、0を与えると出力ポート。
サンプル:set_tris_b( 0x0f ); // B7,B6,B5,B4 は出力、B3,B2,B1,B0 は入力
サンプルプログラム
#include <16f84A.h>
#use delay(clock=20000000)
#fuses HS, NOWDT, PUT, NOPROTECT
void main()
{
int i=1,j,x=0;
set_tris_b(0x01);
//ポートbの0を入力に設定、1~7は出力
while (input( PIN_B0 ) );
//押すとLow・・・B0入力を待ちます。
for(j=0;j<7;j++){
//ポートbに1,2,4,8・・と順に出力(0.5秒間隔で)
i=i*2;output_b(i);
delay_ms(500);
}
for(j=0;j<8;j++){
// ポートbの値を全てLow、全てHightを繰り返す
output_b(0);delay_ms(500);
output_b(255);delay_ms(500);
}
return;
}
Ⅲ-29
H403
1.
PICによるDCモータの制御
目的
モータを On/Off 制御する時の基本回路について学ぶとともに、モータドライブ用の専用ICを使って車
を制御する方法を習得する。
2.
基本事項
【DCモータとは?】
DCモータとは、固定子に永久磁石を使い、回転子(電機子)にコイルを使って構成されたもので、
電機子に流れる電流の向きを切り替えることで磁力の反発、吸引の力で回転力を生成させるものです。
早い話が模型やミニ四駆、ラジコンに使っているモータです。
【モータの制御】
モータをコンピュータで制御する時の基本は On/Off 制御です。つまり、モータの起動・停止だけで制御
します。起動・停止だけで制御できるものは数多く、すべてのモータ制御の基本になります。
【制御基本回路】
モータを On/Off 制御する時の基本回路には幾つかあります。
(1) トランジスタ駆動(エミッタ負荷)
下図の回路としてトランジスタを On/Off することで、モータを On/Off します。しかし、この回路
はトランジスタを完全に飽和した On 状態にはできず、Vce が大きいので電圧ロスが大きくなってしまい
ます。動作としては、自動的に負帰還が働くため動作は安定です。このため、簡易な速度制御を行うた
めオペアンプを追加した回路が使われます。この場合、トランジスタでの電力ロスがそのまま熱となり
ますので、トランジスタの熱対策は十分行う必要があります。
(2)トランジスタ駆動(コレクタ負荷)
モータをトランジスタのコレクタの負荷としたも
ので、トランジスタを完全に飽和した On 状態で駆動で
きるため、ドライブ能力が大きく電圧ロスも少なく出来
ます。従って、一般的にはこの回路が多用されています。
Ⅲ-30
(3)逆起電力の処理
トランジスタが On となってモータが回っている間には、
モータのコイルにはエネルギーが貯えられています。
そしてトランジスタがOffとなると、そのエネルギー
を放出しようとするため、モータのコイルの両端には、
プラスマイナスが逆向きの起電力が発生します。
この電圧は非常に大きくなるため、そのままではトラン
ジスタが破壊されてしまうこともあります。
そこで、この対策として、コイルをショートさせて残っ
ているエネルギーを瞬間的に電流として流してしまい、
逆起電力を抑制してしまうようにします。
この働きをするのが下図のダイオードの働きで、逆向き
の起電力のみショートさせ、通常の電圧に対しては高
抵抗となり何もしないことになります。
【Hブリッジ制御回路】
モータの On/Off 制御は上記の回路で問題無く出来ます。しかし
回転の向きを変えたい時には、どうしたら良いのでしょうか。
モータに加える電圧のプラスマイナスを逆にすればモータは
逆転するのですが、上記回路ではそれは難しいことです。
そこで、単一の電源でモータに加える電圧の向きを変えられる
回路として考案されたのが、「Hブリッジ回路」です。
基本構成は下図の様になっており、H型をしていることから
こう呼ばれています。
基本動作は、Q1とQ4のトランジスタだけを同時に On とすると、青線の様に電流が流れ、モータは正転し
ます。逆にQ2とQ3だけを On とすれば、赤線の様に電流が流れ、モータは逆転することになります。
さらにQ3とQ4だけを同時にOnとするとモータにブレーキをかける動作となります。
【モータドライバIC】
最近は、モータドライブ用の専用ICがあり、これらには上記のHブリッジが内蔵されているものがほとん
どですので、
トランジスタ等のディスクリート部品で組むことはほとんど必要が無いようになっています。
当然のことながら、逆起電力吸収用のダイオードも内蔵されていますが、それ以外に熱遮断回路や過電流保
護回路も内蔵されています。
下記はこのモータドライバの代表的なICです。
TA7257P /TA7291P
Ⅲ-31
PICに接続するのは、IN1,IN2 の2ラインだけで、これで正逆転、ストップを制御出来ます。
TA7291
ピン
接続
P
S
VCC
7
2 ドライバICの電源
VS
8
6 モーター用電源
VREF
4
8 モーターの電源コントロール用
GND
1
5
IN1
5
9 マイコンにつなぐ信号1
IN2
6
1 マイコンにつなぐ信号2
OUT1
2
7 モーターにつなぐ
ピン番号は型番文字の書いてある側と向き合
って、左から1、2、3・・・・
となります。
OUT2 10 3 モーターにつなぐ
〔VCC
VS〕
ドライバICも動作するのに電源が必要なので、VCCに5Vをつなぎます。VSにモーター用の電源
をつなぎます。
〔IN1 IN2 、 OUT1 OUT2〕
マイコンから2本のピンをIN1,IN2につなぎます。この2本のIOで方向回転などをコント
ロールします。
IN1 IN2
0
0
1
0
0
1
1
1
OUT1、OUT2の端子にモーターをつなぎます。
マイコンからの信号が
マイコン
ドライバ IC
OUT1 OUT2 機能
1 → IN1
で 時計回り(CW:クロックワイズ)
∞ ∞ ストップ
0 → IN2
とすると
H
L
CW
0 → IN1
で 反時計回り(
L
H
CCW
1 → IN2
CCW:カウンタークロックワイズ)
L
L ブレーキ
にコントロールできます。
これ以外に、ストップとブレーキがあります。
ブレーキにするとキュッと歯切れ良くとまります。
〔VREF〕
VREFはモーターへの電圧を調整するときに使います。
通常このピンはモーター電源につなげておきます。
Ⅲ-32
4.実習内容
練習
スイッチを入力すると5秒間前進する。
フローチャート
プログラム
#include <16f84a.h>
#use delay(clock=20000000)
#fuses HS, NOWDT, PUT, NOPROTECT
void main()
{
set_tris_b(0x0f); //b0-b3 を入力、b4-b7 を出力に設定
output_bit(PIN_B4,0); //停止:初期状態
output_bit(PIN_B5,0);
output_bit(PIN_B6,0);
output_bit(PIN_B7,0);
delay_ms(50);
while(input(PIN_B0)); //スタートボタンの入力待ち
output_bit(PIN_B4,0); //前進
output_bit(PIN_B5,1);
output_bit(PIN_B6,0);
output_bit(PIN_B7,1);
delay_ms(5000);
//5 秒走行
output_bit(PIN_B4,0); //停止
output_bit(PIN_B5,0);
output_bit(PIN_B6,0);
output_bit(PIN_B7,0);
return;
}
下記のような動作をするプログラムを作成しなさい。
(友達と情報交換をして作業を進めなさい。)
実習1
ボタンを押してスタートし前進3秒、その後Uターンしてスタートに戻る。停止。
実習2
ボタンを押して前進、その後、右ボタンで右回り、左ボタンで左回り。
(片方のモータだけを前進)
ヒント:前進(0.05)→ボタン判断(停止(0.05)→回る(0.5))・・・・を永久ループ
実習3
ボタンを押して前進、その後、右ボタンで左回り、左ボタンで右回り。
(片方は前進、もう一方は後退)
実習4
別途コースをスタートよりゴールまで進む。
ヒント:ボタン判断での回転は、少しバックしてから。
レポート
基本事項:モータの制御方法とモータ制御ICの使用方法について
PICでのモータの制御の方法
実 習 :各問題のプログラムリスト。
フローチャートは全ての問題について作成する。(出来ていないときは自分の考え)
感 想
Ⅲ-33
R001 2足歩行ロボットの制御
○目的
2足歩行ロボットを使って、サーボモータの仕組みや歩行
ロボットの制御方法について知る。
○基本事項
ロボットに使われるモータとその制御について
一般にロボットに使われるモータは、もともとラジコン飛行機
や車の舵等で使われるR/Cサーボを改良したものが使われている。別紙参照
今回使用するロボット
近藤科学のKHR-1で、制御にはPICの搭載されたRCB-1を使用。KHR-1では、コ
ントロールボードRCB-1を2台シンクロさせて17個のサーボモ-タをコントロールする。1枚
のRCB-1ボードで12台のサーボモータの制御が可能。
○実
習
二足歩行ロボットの制御1
ここでは、専用ソフト(Heart To Heart)を使用する・・・別冊のマニュアル参照
1.トリムの設定
・・・トリムとはサーボモータの最初の位置を正確に決めるためのものである。サーボ
モータは可動範囲が限られているので、この値はあまり大きくならないように注
意する。
2.ホームポジションの設定
・・・二足歩行ロボットの最初の姿勢を設定する。サーボモータには常に負荷がかかっ
ているため、出来るだけ負荷のかからない姿勢にする
3.モーション(動作)データの作成
・・・サンプルモーションで確認
・・・ロボットのモーションを作成1
サーボモータに数値データを与えてのモーションの作成
・・・ロボットのモーションを作成2
ロボットのティーチング機能を使ってのモーション作成
4.シナリオの作成
・・・複数のモーションを組み合わせて一連の動作をさせる
二足歩行ロボットの制御2
C#を使ってのロボットの制御
・・・メーカーから提供されているC#のクラス(オブジェクト)を利用しKHR-1
を制御する。今回のプログラムはコマンドボタンを用意し、クリックされたらそ
れに対応するモーションデータを呼び出してその動作をさせるというものです。
まずロボットへの命令などが入っている Temma を追加します。
Rcb1 Rcb = new Rcb1(1);
でロボットへの命令に使うためのクラス
Rcbを作成し、Rcb.PlayMot(モーション番号)でそのモーションを再生
することができる。
Ⅲ-34
:
private void Form1_Load(object sender, EventArgs e)
{
rcb = new Rcb1(4);
//4はCOMポート
}
:
private void button1_Click
(object sender, EventArgs e)
{
rcb.PlayMot(1)); //モーシュン1の実行
}
サーボモータとは
ロボットのサーボモータはラジコンカーのステアリン
グ(ハンドル)操作などに使われるモータと同じで、回
転角度がせいぜい 180°以下程度までしかありません。
しかし、簡単に正確な回転角度の制御ができます。ロボ
ットの関節に直接利用するような用途には非常に便利
です。サーボモータのトルクは、数 Kg/cm~数十 Kg/cm
です。
サーボモータからは、以下のようなケーブルとコネクタがシッポのように生えています。
ケーブルの色と意味
1.白:制御信号を入力します。
2.赤:+の電源を加えます。
3.黒:GND
※ただし、機種によって違うこともあるので注意!
白のケーブルにサーボモータの停止角度を決めるための制御信号
を与えます。
■制御信号(PWM)は以下のようなパルス信号となります。
20mS の周期で 1mS から 2mS 幅のパルス信号を加えると、サーボはパルス幅に見合った角度で左右に
首を振ります。1.5mS幅のパルスにすると、ほぼ中間位置で停止し、それよりも短いパルス幅だと
左周りに、長いパルス幅だと右周りに首を振ります。
つまり、1.5mS幅を中心として、±約0.8mSだけパルス幅を増減させることによって、連続的
に首振りの角度を制御することができます。
このとき、一般に制御信号(PWM)はPICなどのマイコンなどで生成され、その方法はPICが持
っているPWM命令で作成されるハード的なものと、プログラムでパルスを発生させるソフト的なもの
がある。
Ⅲ-35
R001 実習「2足歩行ロボットの制御」
目的
指導のポイント
2足歩行ロボットを使って、サーボモータの仕組みや歩行ロボットの制御方法
について知る。
基本事項の説明
・ロボットに使われるモータとその制御について
・今回使用するロボット、近藤化学のKHR-1について
KHR-1 では、コントロールボード RCB-1
2 台をシンクロさせてサーボモーターをコント
ロールする。2 枚では、24 台のサーボの接続が可能なため、将来のオプションパーツや、
自作改造によるサーボの追加もできる。
3.実習内容
・準備
電池を入れ、背中のところに接続する。次にパソコンとケーブルで接続(場所、
向きに注意)し、電源を入れる。
・二足歩行ロボットの制御1・・・専用ソフト(Heart To Heart)を使用する。
1.トリムの設定
トリムとはサーボモータの初期状態のずれ等を修正し、位置を正確に決めるためのも
のである。値はあまり大きくならないように注意。
2.ホームポジションの設定
二足歩行ロボットの初期状態の姿勢を設定する。
サーボモータには常に不可がかかっているため、できるだけ負荷のかからない姿勢に
する。基本は立ちの状態で手は下げ、股関節あたりを少し後ろに下げる感じの姿勢に
する。これで、モーションで動作した後に元に戻したいときはホームポジションのボ
タンを押せばすぐにその姿勢に戻る。
3.モーション(動作)データの作成
・サンプルモーションで確認
まずロボットでどのような動作ができるのかを確認する。モーションデータの編集
を開き、あらかじめ用意されているサンプルモーションを開きます。
モーションを読み込んだらそのデータをロボットの方に転送し実行。
Ⅲ-36
・ロボットのモーションを作成1
サーボモータに直接数値データを与えて動かしていき、モーションを作成する。
足などを動かす際は、必ず誰かが支えながら動かすこと。重要
また、あまり一気に数値を変えるとモータに大きな負担がかかるのと、支えている
者が手などを挟むので気をつける。
・・・・モーション1で保存
・ロボットのモーション作成2
ロボットのティーチング機能を使ってモーションを作成する。
数値を変更するのと違って、直接ロボットを動かして、その状態のデータを読み込
み動作を作るものです。
動かすだけ動かして、データを読み取り忘れるなんて馬鹿なことはやらないよう
にする。パラパラ漫画の要領・・・・モーション2で保存
・ロボットのモーション作成3
ホームポジション・・・・モーション0で保存
4.シナリオデータの作成
これまでに作ったモーション(0~2)を組み合わせて一連の動作を作ります。
メインウィンドウからシナリオデータの編集を開きます。
そしたら今までに作ったモーションを好きなように組み合わせていきシナリオを作
成する。後はそれを実行して一連の流れができるかを試します。
・二足歩行ロボットの制御2
C#を使ってのロボットの制御
メーカーから提供されている C#のクラス(オブジェクト)を利用し KHR-1(RCB1)
を制御する。
C#とは VB、C、JAVA のそれぞれの言語の良い所を集めてきて、より使いやすくされた
ものです。・・・ 詳細は次回へ。
今回のプログラムはコマンドボタンを用意し、クリックされたらそれに対応するモーシ
ョンデータを呼び出してその動作をさせるというものです。
まずロボットへの命令などが入っている
その後は
Rcb1 Rcb = new Rcb1(1);
Temma を追加(参照設定)します。
でロボットへの命令に使うための Rcb を作成し、
Rcb.PlayMot(モーション番号)でそのモーションを再生することができる。
Ⅲ-37
R002
2足歩行ロボットの遠隔操作
○目的
C#を用いた通信プログラムについて学習し、2足歩行ロボットをLAN経由で遠隔操
作するプログラム作成をとおして、最先端技術に対応できる能力を身に付ける。
○基本事項
C#プログラムの構造
C#プログラムの構造を大まかに図にす
るとこのようになる。最も外側にネームス
ペースがあり、そのなかにクラスが含ま
れ、クラスのなかにメソッドが含まれる。
変数は、各クラスごとに共通に使われるも
のと、メソッド内部に固有のものがある。
C#による通信プログラム
VB6では Winsock オブジェクトを貼り付けて簡単に通信プログラムが作成できたが、
それ以降の言語では「.NET Framework」を使用した Socket プログラムへと変化してきた。
C#では System.Net や System.Net.Sockets ネームスペース内にあるクラスによって通信
機能のプログラムが出来る。
【別紙簡易通信プログラム参照】
○実習内容
・右図のように接続し、各ノートPCのIPアドレス
とKHR-1の通信ポートを確認する。
・A4はサーバープログラムを作成し、動作内容は
実行 →
受信クリック
→
LANから受信
→
受信した番号のモーションを KHR-1 で実行
→
通信終了処理
とする。
・B5ではクライアントを作成し、動作内容は
実行
→
→
相手IP設定
接続処理
→
→
Motionボタン押す
モーション番号送信
とする。
≪完成した人は、サーバの自動連続受信と
クライアントからの色々なモーション送信
に挑戦しなさい≫
Report:表紙、プリント、プログラムコード、まとめ(通信に使用するクラスと手順についてまとめよ)
、感想
Ⅲ-38
参考:Microsoft Visual Studio 2005 C#
*** Server Program ***
private void button1_Click(object sender, EventArgs e)
{
Int32 port = 50001;
string ip = "192.168.1.5";
System.Net.IPAddress localhost = System.Net.IPAddress.Parse(ip);
System.Net.Sockets.TcpListener server = new System.Net.Sockets.TcpListener(localhost, port);
server.Start();
System.Net.Sockets.TcpClient accept = server.AcceptTcpClient();
System.Net.Sockets.NetworkStream stream = accept.GetStream();
byte[] buf = new byte[1024];
int size = stream.Read(buf, 0, buf.Length);
string recv = System.Text.Encoding.ASCII.GetString(buf,0,size);
textBox1.Text = recv;
accept.Close();
server.Stop();
}
*** Client Program ***
private void button1_Click(object sender, EventArgs e)
{
System.Net.Sockets.TcpClient client = new System.Net.Sockets.TcpClient();
client.Connect(textBox2.Text , 50001);
System.Net.Sockets.NetworkStream stream = client.GetStream();
byte[] send = Encoding.ASCII.GetBytes(textBox1.Text);
stream.Write(send, 0, send.Length);
}
Ⅲ-39
R002
ロボットの遠隔操作
[指導のポイント]
・基本事項
C#プログラムの構造
ネームスペースより中に定義されているものは、そのまま利用できる。
ネームスペースの外で定義されているものは、フルネーム指定で利用可能。
毎回フルネームで指定するのが手間なので、using 指定で省略ができる。
例: int は、正式には System.int32
using Temma;を定義しなかった場合、Rcb1 rcb=New Rcb1(1)は、
Temma.Rcb1 rcb=New Temma.Rcb1(1)となる。
C#による通信プログラム
サンプルを参考に手順を考える。 横長なプログラムは using System.Net と.Sockets で短縮可能。
*サーバ側
自分の IP アドレスと受信ポート番号を定義
待ち受け(TcpListener)を作成し、待ち状態に入る。(他の処理は受け付けなくなる)
受信要求(Accept)により新たな通信(Stream)を成立させ、受信するデータ量を調べる。
受信した ASCII 文字列より、通常使用している形式に変換した文字列を取り出す。
画面表示した後、通信の終了と待ちの開放を行い終了した場合、再度接続可能になる。
*クライアント側
通信に使用するクライアントの作成
サーバーへ接続を要求。
(サーバーは待ち受け状態に入っていること)
通信経路の作成(Stream)
そのままのデータを送受信できないので形式を変換した後、送信する。
実習内容
無線LANカードを接続し、ipconfig をコンソールから実行。IPアドレスをメモしておくこと。
A4(サーバー)側で受信を押した後で、B5(クライアント)のボタンを押して送信すること。
プログラム組み換えのポイント
*全般的な注意事項
オブジェクトの型には細かいC#なので、キャストや型変換命令をしっかりと使うこと。
数値型→文字型 x.toString() 文字型→数値型
Int32.Parse(文字列)
*サーバー
KHR-1 コントロールの為の Temma 定義。
Rcb1 クラスの変数作成は Public Form1()の手前。
ポート番号の設定&インスタンス作成は Form1 の Load で行えばよい。
*クライアント
複数のボタンから違ったモーション番号を送信するには・・・ 送信用関数を作ると楽。
押したボタンによって違う引数で関数を呼べば、同じプログラムが使用できて効率が良い。
レポート順は、下に書いてある通り。まとめは通信に使用したクラスやオブジェクトについてまとめること。
感想部分を重視しているので、しっかりと感想を書くこと。
Ⅲ-40
●プログラム例
:
using System.Net;
サーバー側
using System.Net.Sockets;
namespace KHR1_client
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent(); }
private void button1_Click(object sender, EventArgs e)
{
send_command(1);
}
private void send_command(int no)
{
TcpClient tc = new TcpClient();
tc.Connect(textBox1.Text, 50001);
NetworkStream ns = tc.GetStream();
byte[] send = Encoding.ASCII.GetBytes(no.ToString());
ns.Write(send, 0, send.Length);
}
private void button2_Click(object sender, EventArgs e)
{ send_command(2); }
:
using System.Net;
using System.Net.Sockets;
using Temma;
namespace KHR1_Server
{
public partial class Form1 : Form
{
private void button3_Click(object sender, EventArgs e)
{ send_command(5); }
}
}
クライアント側
Rcb1 rcb;
public Form1()
{ InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e)
{ rcb = new Rcb1(4);
}
private void button2_Click(object sender, EventArgs e)
{ Close(); }
private void button1_Click(object sender, EventArgs e)
{
IPAddress localhost = IPAddress.Parse("192.168.1.173");
TcpListener server = new TcpListener(localhost, 50001);
server.Start();
TcpClient accept = server.AcceptTcpClient();
NetworkStream stream = accept.GetStream();
byte[] buf = new byte[255];
int size = stream.Read(buf, 0, buf.Length);
string recv = Encoding.ASCII.GetString(buf, 0, size);
rcb.PlayMot(Int32.Parse(recv));
accept.Close();
server.Stop();
}
}
}
Ⅲ-41
© Copyright 2026 Paperzz