Skip to content

Commit 4b3bc2c

Browse files
authored
Open Bot Brain touch sensor support. (#321)
* Initial work on getting analog read working This will also make the touch sensors work! * work in progress adc3 configuration for input 1 * Switch between adcs for the different ports Currently done with an if, we probably want to do this with an array in the end. * Add pin 6 channels for ev3 touch sensors * EV3 Touch sensor support * Rename analog_read to nxt_touch_sensor Will add support for generic analog_read later. * Rename analog_read to nxt_touch_sensor Will add support for generic analog_read later. * clang-format * Minor changes + add print_string to zephyr * Added nxt and ev3 touch sensor primitives to the emulator Instead of always returning 1 or 0 they also use a random 12bit number.
1 parent 0ce0b7f commit 4b3bc2c

File tree

4 files changed

+365
-3
lines changed

4 files changed

+365
-3
lines changed

platforms/Zephyr/boards/stm32l496g_disco.overlay

Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,3 +180,249 @@
180180
status = "okay";
181181
pinctrl-names = "default";
182182
};
183+
184+
&adc1 {
185+
pinctrl-0 = < &adc1_in5_pa0 >;
186+
#address-cells = <1>;
187+
#size-cells = <0>;
188+
189+
channel@0 {
190+
reg = <0>;
191+
zephyr,gain = "ADC_GAIN_1";
192+
zephyr,reference = "ADC_REF_INTERNAL";
193+
zephyr,vref-mv = <8>;
194+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
195+
zephyr,resolution = <12>;
196+
};
197+
198+
channel@1 {
199+
reg = <1>;
200+
zephyr,gain = "ADC_GAIN_1";
201+
zephyr,reference = "ADC_REF_INTERNAL";
202+
zephyr,vref-mv = <8>;
203+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
204+
zephyr,resolution = <12>;
205+
};
206+
207+
channel@2 {
208+
reg = <2>;
209+
zephyr,gain = "ADC_GAIN_1";
210+
zephyr,reference = "ADC_REF_INTERNAL";
211+
zephyr,vref-mv = <8>;
212+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
213+
zephyr,resolution = <12>;
214+
};
215+
216+
channel@3 {
217+
reg = <3>;
218+
zephyr,gain = "ADC_GAIN_1";
219+
zephyr,reference = "ADC_REF_INTERNAL";
220+
zephyr,vref-mv = <8>;
221+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
222+
zephyr,resolution = <12>;
223+
};
224+
225+
channel@4 {
226+
reg = <4>;
227+
zephyr,gain = "ADC_GAIN_1";
228+
zephyr,reference = "ADC_REF_INTERNAL";
229+
zephyr,vref-mv = <8>;
230+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
231+
zephyr,resolution = <12>;
232+
};
233+
234+
channel@5 {
235+
reg = <5>;
236+
zephyr,gain = "ADC_GAIN_1";
237+
zephyr,reference = "ADC_REF_INTERNAL";
238+
zephyr,vref-mv = <8>;
239+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
240+
zephyr,resolution = <12>;
241+
};
242+
243+
channel@6 {
244+
reg = <6>;
245+
zephyr,gain = "ADC_GAIN_1";
246+
zephyr,reference = "ADC_REF_INTERNAL";
247+
//zephyr,vref-mv = <8>;
248+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
249+
zephyr,resolution = <12>;
250+
};
251+
252+
channel@7 {
253+
reg = <7>;
254+
zephyr,gain = "ADC_GAIN_1";
255+
zephyr,reference = "ADC_REF_INTERNAL";
256+
//zephyr,vref-mv = <8>;
257+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
258+
zephyr,resolution = <12>;
259+
};
260+
261+
channel@8 {
262+
reg = <8>;
263+
zephyr,gain = "ADC_GAIN_1";
264+
zephyr,reference = "ADC_REF_INTERNAL";
265+
//zephyr,vref-mv = <8>;
266+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
267+
zephyr,resolution = <12>;
268+
};
269+
270+
channel@9 {
271+
reg = <9>;
272+
zephyr,gain = "ADC_GAIN_1";
273+
zephyr,reference = "ADC_REF_INTERNAL";
274+
//zephyr,vref-mv = <8>;
275+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
276+
zephyr,resolution = <12>;
277+
};
278+
279+
channel@10 {
280+
reg = <10>;
281+
zephyr,gain = "ADC_GAIN_1";
282+
zephyr,reference = "ADC_REF_INTERNAL";
283+
//zephyr,vref-mv = <8>;
284+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
285+
zephyr,resolution = <12>;
286+
};
287+
};
288+
289+
&pinctrl {
290+
adc3_test: adc3_test {
291+
pinmux = <STM32_PINMUX('F', 0, ANALOG)>;
292+
};
293+
};
294+
295+
&adc3 {
296+
status = "okay";
297+
st,adc-clock-source = "SYNC";
298+
st,adc-prescaler = < 0x4 >;
299+
resolutions = < 0x60630c 0x51630c 0x42630c 0x33630c >;
300+
sampling-times = < 0x3 0x7 0xd 0x19 0x30 0x5d 0xf8 0x281 >;
301+
st,adc-sequencer = "FULLY_CONFIGURABLE";
302+
st,adc-oversampler = "OVERSAMPLER_MINIMAL";
303+
pinctrl-names = "default";
304+
pinctrl-0 = < &adc3_test >;
305+
#address-cells = <1>;
306+
#size-cells = <0>;
307+
308+
channel@0 {
309+
reg = <0>;
310+
zephyr,gain = "ADC_GAIN_1";
311+
zephyr,reference = "ADC_REF_INTERNAL";
312+
zephyr,vref-mv = <8>;
313+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
314+
zephyr,resolution = <12>;
315+
};
316+
317+
channel@1 {
318+
reg = <1>;
319+
zephyr,gain = "ADC_GAIN_1";
320+
zephyr,reference = "ADC_REF_INTERNAL";
321+
zephyr,vref-mv = <8>;
322+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
323+
zephyr,resolution = <12>;
324+
};
325+
326+
channel@2 {
327+
reg = <2>;
328+
zephyr,gain = "ADC_GAIN_1";
329+
zephyr,reference = "ADC_REF_INTERNAL";
330+
zephyr,vref-mv = <8>;
331+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
332+
zephyr,resolution = <12>;
333+
};
334+
335+
channel@3 {
336+
reg = <3>;
337+
zephyr,gain = "ADC_GAIN_1";
338+
zephyr,reference = "ADC_REF_INTERNAL";
339+
zephyr,vref-mv = <8>;
340+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
341+
zephyr,resolution = <12>;
342+
};
343+
344+
channel@4 {
345+
reg = <4>;
346+
zephyr,gain = "ADC_GAIN_1";
347+
zephyr,reference = "ADC_REF_INTERNAL";
348+
zephyr,vref-mv = <8>;
349+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
350+
zephyr,resolution = <12>;
351+
};
352+
353+
channel@5 {
354+
reg = <5>;
355+
zephyr,gain = "ADC_GAIN_1";
356+
zephyr,reference = "ADC_REF_INTERNAL";
357+
zephyr,vref-mv = <8>;
358+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
359+
zephyr,resolution = <12>;
360+
};
361+
362+
channel@6 {
363+
reg = <6>;
364+
zephyr,gain = "ADC_GAIN_1";
365+
zephyr,reference = "ADC_REF_INTERNAL";
366+
//zephyr,vref-mv = <8>;
367+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
368+
zephyr,resolution = <12>;
369+
};
370+
371+
channel@7 {
372+
reg = <7>;
373+
zephyr,gain = "ADC_GAIN_1";
374+
zephyr,reference = "ADC_REF_INTERNAL";
375+
//zephyr,vref-mv = <8>;
376+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
377+
zephyr,resolution = <12>;
378+
};
379+
380+
channel@8 {
381+
reg = <8>;
382+
zephyr,gain = "ADC_GAIN_1";
383+
zephyr,reference = "ADC_REF_INTERNAL";
384+
//zephyr,vref-mv = <8>;
385+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
386+
zephyr,resolution = <12>;
387+
};
388+
389+
channel@9 {
390+
reg = <9>;
391+
zephyr,gain = "ADC_GAIN_1";
392+
zephyr,reference = "ADC_REF_INTERNAL";
393+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
394+
zephyr,resolution = <12>;
395+
};
396+
397+
channel@10 {
398+
reg = <10>;
399+
zephyr,gain = "ADC_GAIN_1";
400+
zephyr,reference = "ADC_REF_INTERNAL";
401+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
402+
zephyr,resolution = <12>;
403+
};
404+
405+
channel@11 {
406+
reg = <11>;
407+
zephyr,gain = "ADC_GAIN_1";
408+
zephyr,reference = "ADC_REF_INTERNAL";
409+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
410+
zephyr,resolution = <12>;
411+
};
412+
413+
channel@12 {
414+
reg = <12>;
415+
zephyr,gain = "ADC_GAIN_1";
416+
zephyr,reference = "ADC_REF_INTERNAL";
417+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
418+
zephyr,resolution = <12>;
419+
};
420+
421+
channel@13 {
422+
reg = <13>;
423+
zephyr,gain = "ADC_GAIN_1";
424+
zephyr,reference = "ADC_REF_INTERNAL";
425+
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
426+
zephyr,resolution = <12>;
427+
};
428+
};

platforms/Zephyr/prj.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
CONFIG_GPIO=y
22
CONFIG_PWM=y
3+
CONFIG_ADC=y
34
CONFIG_CPP=y
45
CONFIG_STD_CPP17=y
56
CONFIG_REQUIRES_FULL_LIBCPP=y

src/Primitives/emulated.cpp

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <cmath>
1919
#include <cstdio>
2020
#include <cstring>
21+
#include <random>
2122
#include <thread>
2223

2324
#include "../Memory/mem.h"
@@ -27,7 +28,7 @@
2728
#include "primitives.h"
2829

2930
#define NUM_PRIMITIVES 0
30-
#define NUM_PRIMITIVES_ARDUINO 35
31+
#define NUM_PRIMITIVES_ARDUINO 37
3132

3233
#define ALL_PRIMITIVES (NUM_PRIMITIVES + NUM_PRIMITIVES_ARDUINO)
3334

@@ -558,6 +559,28 @@ def_prim(read_uart_sensor, oneToOneI32) {
558559
return true;
559560
}
560561

562+
std::random_device r;
563+
std::default_random_engine e(r());
564+
std::uniform_int_distribution<int16_t> adc_dist(0, 1 << 12); // 12 bit adc
565+
566+
def_prim(nxt_touch_sensor, oneToOneU32) {
567+
const uint32_t port = arg0.uint32;
568+
const int16_t v = adc_dist(e);
569+
pop_args(1);
570+
printf("nxt_touch_sensor(%u) = %d\n", port, v < 2000);
571+
pushUInt32(v < 2000);
572+
return true;
573+
}
574+
575+
def_prim(ev3_touch_sensor, oneToOneU32) {
576+
const uint32_t port = arg0.uint32;
577+
const int16_t v = adc_dist(e);
578+
pop_args(1);
579+
printf("ev3_touch_sensor(%u) = %d\n", port, v > 3000);
580+
pushUInt32(v > 3000);
581+
return true;
582+
}
583+
561584
def_prim(subscribe_interrupt, threeToNoneU32) {
562585
uint8_t pin = arg2.uint32; // GPIOPin
563586
uint8_t tidx = arg1.uint32; // Table Idx pointing to Callback function
@@ -661,6 +684,8 @@ void install_primitives() {
661684
install_primitive(stop_motor);
662685
install_primitive(setup_uart_sensor);
663686
install_primitive(read_uart_sensor);
687+
install_primitive(nxt_touch_sensor);
688+
install_primitive(ev3_touch_sensor);
664689
}
665690

666691
//------------------------------------------------------

0 commit comments

Comments
 (0)