source: EcnlProtoTool/trunk/mrbgems/mruby-arduino/src/sServo.c@ 270

Last change on this file since 270 was 270, checked in by coas-nagasima, 7 years ago

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 6.6 KB
Line 
1/*
2 * サーボ・ハード関連
3 *
4 * Copyright (c) 2016 Wakayama.rb Ruby Board developers
5 *
6 * This software is released under the MIT License.
7 * https://github.com/wakayamarb/wrbb-v2lib-firm/blob/master/MITL
8 *
9 */
10#include <arduino.h>
11/*#include <servo.h>*/
12
13#include <mruby.h>
14/*#include <mruby/string.h>*/
15/*#include <mruby/variable.h>*/
16
17#include "../llbruby.h"
18#include "sKernel.h"
19
20#define ATTACH_MAX 12
21struct pin_node *servo[ATTACH_MAX];
22
23/******************************************************/
24/* サーボ出力を任意のピンに割り当てます: Servo.attach*/
25/* Servo.attach(ch, pin[,min,max])*/
26/* ch: サーボのチャネル 0~11まで指定できます*/
27/* pin: 割り当てるピン番号*/
28/* min: サーボの角度が0度のときのパルス幅
29(マイクロ秒)。デフォルトは544*/
30/* max: サーボの角度が180度のときのパルス幅
31(マイクロ秒)。デフォルトは2400*/
32/******************************************************/
33mrb_value mrb_servo_attach(mrb_state *mrb, mrb_value self)
34{
35 int ch;
36 int pinno;
37 int min;
38 int max;
39 struct pin_node *pin;
40
41 int n = mrb_get_args(mrb, "ii|ii", &ch, &pinno, &min, &max);
42
43 if (pinno >= 20) {
44 return mrb_nil_value(); /*戻り値は無しですよ。*/
45 }
46
47 /* nが2以下のときは、minが引数に無いので、 */
48 if (n <= 2) {
49 min = 544;
50 }
51
52 /* nが3以下のときは、maxが引数に無いので、 */
53 if (n <= 3) {
54 max = 2400;
55 }
56
57 if (ch < 0 || ch >= ATTACH_MAX) {
58 return mrb_nil_value(); /*戻り値は無しですよ。*/
59 }
60
61 if (servo[ch] != 0) {
62 pwmout_free(&servo[ch]->pwmout);
63 /*servo[ch] = 0;*/
64 }
65
66 pin = get_pin(pintype_pwmout, pinno);
67 if (pin == NULL)
68 return mrb_nil_value(); /*戻り値は無しですよ。*/
69
70 servo[ch] = pin;
71 servo[ch]->min = min;
72 servo[ch]->max = max;
73
74 return mrb_nil_value(); /*戻り値は無しですよ。*/
75}
76
77/******************************************************/
78/* サーボの角度をセットします: Servo.write*/
79/* Servo.write(ch,angle)*/
80/* ch: サーボのチャネル 0~11まで指定できます*/
81/* angle: 角度 0~180*/
82/******************************************************/
83mrb_value mrb_servo_write(mrb_state *mrb, mrb_value self)
84{
85 int ch;
86 int angle;
87 int min;
88 int max;
89
90 mrb_get_args(mrb, "ii", &ch, &angle);
91
92 if (ch < 0 || ch >= ATTACH_MAX) {
93 return mrb_nil_value(); /*戻り値は無しですよ。*/
94 }
95
96 if (servo[ch] == NULL) {
97 return mrb_nil_value(); /*戻り値は無しですよ。*/
98 }
99
100 DEBUG_PRINT("Servo", angle);
101
102 min = servo[ch]->min;
103 max = servo[ch]->max;
104 angle *= servo[ch]->period;
105
106 pwmout_pulsewidth_us(&servo[ch]->pwmout, (angle * (max - min)) / 180 + min);
107
108 return mrb_nil_value(); /*戻り値は無しですよ。*/
109}
110
111/******************************************************/
112/* サーボモータにus単位で角度を指定する: Servo.us*/
113/* Servo.us(ch,us)*/
114/* ch: サーボのチャネル 0~11まで指定できます*/
115/* us: 出力したいパルスの幅
116 1~19999, 0で出力 OFF*/
117/* サーボモータに与えられるパルスは20ms周期で、1周期中のHighの時間を直接指定する。*/
118/* 実質的にPWM出力。連続回転タイプのサーボでは、回転のスピードが設定することができる。*/
119/******************************************************/
120mrb_value mrb_servo_us(mrb_state *mrb, mrb_value self)
121{
122 int ch;
123 int us;
124
125 mrb_get_args(mrb, "ii", &ch, &us);
126
127 if (ch < 0 || ch >= ATTACH_MAX) {
128 return mrb_nil_value(); /*戻り値は無しですよ。*/
129 }
130
131 if (servo[ch] == 0) {
132 return mrb_nil_value(); /*戻り値は無しですよ。*/
133 }
134
135 pwmout_pulsewidth_us(&servo[ch]->pwmout, us);
136
137 return mrb_nil_value(); /*戻り値は無しですよ。*/
138}
139
140/******************************************************/
141/* 最後に設定された角度を読み出す: Servo.read*/
142/* Servo.read(ch)*/
143/* ch: サーボのチャネル 0~11まで指定できます*/
144/* 戻り値*/
145/* マイクロ秒単位 us(ch) で与えた値は読みとれない*/
146/******************************************************/
147mrb_value mrb_servo_read(mrb_state *mrb, mrb_value self)
148{
149 int ch;
150 int ret = 0;
151
152 mrb_get_args(mrb, "i", &ch);
153
154 if (ch < 0 || ch >= ATTACH_MAX) {
155 return mrb_fixnum_value(ret);
156 }
157
158 if (servo[ch] == 0) {
159 return mrb_fixnum_value(ret);
160 }
161
162 ret = servo[ch]->pulsewidth;
163
164 return mrb_fixnum_value(ret);
165}
166
167/******************************************************/
168/* ピンにサーボが割り当てられているかを確認する: Servo.attached*/
169/* Servo.attached(ch)*/
170/* ch: サーボのチャネル 0~11まで指定できます*/
171/* 戻り値*/
172/* 1: 割り当てられている*/
173/* 0: 割り当てはない*/
174/******************************************************/
175mrb_value mrb_servo_attached(mrb_state *mrb, mrb_value self)
176{
177 int ch;
178 int ret = 0;
179
180 mrb_get_args(mrb, "i", &ch);
181
182 if (ch < 0 || ch >= ATTACH_MAX) {
183 return mrb_fixnum_value(ret);
184 }
185
186 if (servo[ch] == 0) {
187 return mrb_fixnum_value(ret);
188 }
189
190 if (get_pin_type(servo[ch]->pin) == pintype_pwmout) {
191 ret = 1;
192 }
193
194 return mrb_fixnum_value(ret);
195}
196
197/******************************************************/
198/* サーボの動作を止め、割り込みを禁止する: Servo.detach*/
199/* Servo.detach(ch)*/
200/* ch: サーボのチャネル 0~9まで指定できます*/
201/******************************************************/
202mrb_value mrb_servo_detach(mrb_state *mrb, mrb_value self)
203{
204 int ch;
205
206 mrb_get_args(mrb, "i", &ch);
207
208 if (ch < 0 || ch >= ATTACH_MAX) {
209 return mrb_nil_value(); /*戻り値は無しですよ。*/
210 }
211
212 if (servo[ch] == NULL) {
213 return mrb_nil_value(); /*戻り値は無しですよ。*/
214 }
215
216 pwmout_free(&servo[ch]->pwmout);
217 servo[ch] = 0;
218
219 return mrb_nil_value(); /*戻り値は無しですよ。*/
220}
221
222/******************************************************/
223/* ライブラリを定義します*/
224/******************************************************/
225void servo_Init(mrb_state *mrb)
226{
227 for (int i = 0; i < ATTACH_MAX; i++) {
228 servo[i] = 0;
229 }
230
231 struct RClass *servoModule = mrb_define_module(mrb, "Servo");
232
233 mrb_define_module_function(mrb, servoModule, "attach", mrb_servo_attach, MRB_ARGS_REQ(2) | MRB_ARGS_OPT(2));
234 mrb_define_module_function(mrb, servoModule, "write", mrb_servo_write, MRB_ARGS_REQ(2));
235 mrb_define_module_function(mrb, servoModule, "us", mrb_servo_us, MRB_ARGS_REQ(2));
236 mrb_define_module_function(mrb, servoModule, "read", mrb_servo_read, MRB_ARGS_REQ(1));
237 mrb_define_module_function(mrb, servoModule, "attached", mrb_servo_attached, MRB_ARGS_REQ(1));
238 mrb_define_module_function(mrb, servoModule, "detach", mrb_servo_detach, MRB_ARGS_REQ(1));
239}
Note: See TracBrowser for help on using the repository browser.