Browse Source

replace python display script with gnuradio flowchart; increase sample rate to 400Hz

Fabian Peter Hammerle 3 years ago
parent
commit
c62de7ddb6
6 changed files with 331 additions and 9 deletions
  1. 1 0
      .gitignore
  2. 7 8
      arduino-sketch.ino
  3. 2 0
      display.py~
  4. 26 0
      epy_block_0.py
  5. 2 1
      pre-build-hook.sh
  6. 293 0
      scope.grc

+ 1 - 0
.gitignore

@@ -1,2 +1,3 @@
 /build-*/
+/scope.py
 /version.h

+ 7 - 8
arduino-sketch.ino

@@ -1,27 +1,26 @@
 #include "version.h"
 
 // https://www.arduino.cc/reference/en/language/functions/time/micros/
-const unsigned long SAMPLE_INTERVAL_MICROSECONDS = 1000000L;
+const unsigned long SAMPLE_INTERVAL_MICROSECONDS = 2500L;
 
 void setup() {
     // $ stty -F /dev/ttyUSB0 | grep speed
     Serial.begin(115200);
-    // Serial.println("https://git.hammerle.me/fphammerle/TODO");
+    // Serial.println(PROJECT_REPO_URL);
     // Serial.println(PROJECT_VERSION);
 }
 
 unsigned long last_sample_micros = 0;
 
 void loop() {
-    while (micros() - last_sample_micros < SAMPLE_INTERVAL_MICROSECONDS) {
-        delay(1);
-    }
-    // > On ATmega based boards [...], it takes about 100 microseconds (0.0001
-    // s) to read an analog input, [...]
+    while (micros() - last_sample_micros < SAMPLE_INTERVAL_MICROSECONDS)
+        ;
+    last_sample_micros = micros();
+    // > On ATmega based boards [...], it takes about 100 microseconds
+    // > (0.0001 s) > to read an analog input, [...]
     // https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/
     unsigned short reading = analogRead(A0);
     // $ tail --follow /dev/ttyUSB0 | od --format=u2 --endian=big --width=2
     Serial.write(reading >> 8);
     Serial.write(reading & 0xff);
-    last_sample_micros = micros();
 }

+ 2 - 0
display.py → display.py~

@@ -21,6 +21,8 @@ def _main():
     _LOGGER.debug("args=%r", args)
     with serial.Serial(args.serial_port, 115200, timeout=2) as serial_port:
         _LOGGER.debug("serial_port.name=%s", serial_port.name)
+        # _LOGGER.info("project_repo_url=%s", serial_port.readline().decode().strip())
+        # _LOGGER.info("project_version=%s", serial_port.readline().decode().strip())
         while True:
             reading, = struct.unpack(">H", serial_port.read(2))
             voltage = reading * 5 / 1024

+ 26 - 0
epy_block_0.py

@@ -0,0 +1,26 @@
+import struct
+import time
+
+import gnuradio
+import numpy
+import serial
+
+
+class ArduinoAnalogReadings(gnuradio.gr.sync_block):
+    def __init__(self, port="/dev/ttyUSB0", baud_rate=115200, timeout=2):
+        gnuradio.gr.sync_block.__init__(
+            self, name="Arduino Analog Readings", in_sig=[], out_sig=[numpy.int16]
+        )
+        self._serial_port = serial.Serial(port, baud_rate, timeout=timeout)
+        self._readings_counter = 0
+        self._start_timestamp = None
+
+    def work(self, input_items, output_items):
+        # pylint: disable=unused-argument
+        if not self._start_timestamp:
+            self._start_timestamp = time.time()
+        output_items[0][0] = struct.unpack(">H", self._serial_port.read(2))[0]
+        self._readings_counter += 1
+        if self._readings_counter % 1000 == 0:
+            print(self._readings_counter / (time.time() - self._start_timestamp), "Hz")
+        return 1

+ 2 - 1
pre-build-hook.sh

@@ -1,3 +1,4 @@
 #!/bin/sh
 set -ex
-echo "#define PROJECT_VERSION \"$(shell git describe --dirty --long --always)\"" > version.h
+echo "#define PROJECT_REPO_URL \"$(git config --get remote.origin.url)\"" > version.h
+echo "#define PROJECT_VERSION \"$(git describe --dirty --long --always)\"" >> version.h

+ 293 - 0
scope.grc

@@ -0,0 +1,293 @@
+options:
+  parameters:
+    author: ''
+    category: '[GRC Hier Blocks]'
+    cmake_opt: ''
+    comment: ''
+    copyright: ''
+    description: ''
+    gen_cmake: 'On'
+    gen_linking: dynamic
+    generate_options: qt_gui
+    hier_block_src_path: '.:'
+    id: scope
+    max_nouts: '0'
+    output_language: python
+    placement: (0,0)
+    qt_qss_theme: ''
+    realtime_scheduling: ''
+    run: 'True'
+    run_command: '{python} -u {filename}'
+    run_options: prompt
+    sizing_mode: fixed
+    thread_safe_setters: ''
+    title: Arduino Voltmeter / Oscilloscope
+    window_size: ''
+  states:
+    bus_sink: false
+    bus_source: false
+    bus_structure: null
+    coordinate: [9, 19]
+    rotation: 0
+    state: enabled
+
+blocks:
+- name: reference_voltage
+  id: variable
+  parameters:
+    comment: ''
+    value: '4.11'
+  states:
+    bus_sink: false
+    bus_source: false
+    bus_structure: null
+    coordinate: [730, 64]
+    rotation: 0
+    state: true
+- name: sample_rate_hz
+  id: variable
+  parameters:
+    comment: ''
+    value: 1e6 / 2500
+  states:
+    bus_sink: false
+    bus_source: false
+    bus_structure: null
+    coordinate: [437, 63]
+    rotation: 0
+    state: enabled
+- name: blocks_short_to_float_0
+  id: blocks_short_to_float
+  parameters:
+    affinity: ''
+    alias: ''
+    comment: ''
+    maxoutbuf: '0'
+    minoutbuf: '0'
+    scale: 1024 / reference_voltage
+    vlen: '1'
+  states:
+    bus_sink: false
+    bus_source: false
+    bus_structure: null
+    coordinate: [409, 253]
+    rotation: 0
+    state: true
+- name: epy_block_0
+  id: epy_block
+  parameters:
+    _source_code: "import struct\nimport time\n\nimport gnuradio\nimport numpy\nimport\
+      \ serial\n\n\nclass ArduinoAnalogReadings(gnuradio.gr.sync_block):\n    def\
+      \ __init__(self, port=\"/dev/ttyUSB0\", baud_rate=115200, timeout=2):\n    \
+      \    gnuradio.gr.sync_block.__init__(\n            self, name=\"Arduino Analog\
+      \ Readings\", in_sig=[], out_sig=[numpy.int16]\n        )\n        self._serial_port\
+      \ = serial.Serial(port, baud_rate, timeout=timeout)\n        self._readings_counter\
+      \ = 0\n        self._start_timestamp = None\n\n    def work(self, input_items,\
+      \ output_items):\n        # pylint: disable=unused-argument\n        if not\
+      \ self._start_timestamp:\n            self._start_timestamp = time.time()\n\
+      \        output_items[0][0] = struct.unpack(\">H\", self._serial_port.read(2))[0]\n\
+      \        self._readings_counter += 1\n        if self._readings_counter % 1000\
+      \ == 0:\n            print(self._readings_counter / (time.time() - self._start_timestamp),\
+      \ \"Hz\")\n        return 1\n"
+    affinity: ''
+    alias: ''
+    baud_rate: '115200'
+    comment: ''
+    maxoutbuf: '0'
+    minoutbuf: '0'
+    port: '''/dev/ttyUSB0'''
+    timeout: '2'
+  states:
+    _io_cache: ('Arduino Analog Readings', 'ArduinoAnalogReadings', [('port', "'/dev/ttyUSB0'"),
+      ('baud_rate', '115200'), ('timeout', '2')], [], [('0', 'short', 1)], '', [])
+    bus_sink: false
+    bus_source: false
+    bus_structure: null
+    coordinate: [22, 221]
+    rotation: 0
+    state: true
+- name: qtgui_freq_sink_x_0
+  id: qtgui_freq_sink_x
+  parameters:
+    affinity: ''
+    alias: ''
+    alpha1: '1.0'
+    alpha10: '1.0'
+    alpha2: '1.0'
+    alpha3: '1.0'
+    alpha4: '1.0'
+    alpha5: '1.0'
+    alpha6: '1.0'
+    alpha7: '1.0'
+    alpha8: '1.0'
+    alpha9: '1.0'
+    autoscale: 'False'
+    average: '1.0'
+    axislabels: 'True'
+    bw: sample_rate_hz
+    color1: '"blue"'
+    color10: '"dark blue"'
+    color2: '"red"'
+    color3: '"green"'
+    color4: '"black"'
+    color5: '"cyan"'
+    color6: '"magenta"'
+    color7: '"yellow"'
+    color8: '"dark red"'
+    color9: '"dark green"'
+    comment: ''
+    ctrlpanel: 'False'
+    fc: '0'
+    fftsize: '1024'
+    freqhalf: 'True'
+    grid: 'False'
+    gui_hint: ''
+    label: Relative Gain
+    label1: ''
+    label10: ''''''
+    label2: ''''''
+    label3: ''''''
+    label4: ''''''
+    label5: ''''''
+    label6: ''''''
+    label7: ''''''
+    label8: ''''''
+    label9: ''''''
+    legend: 'False'
+    maxoutbuf: '0'
+    minoutbuf: '0'
+    name: '""'
+    nconnections: '1'
+    showports: 'False'
+    tr_chan: '0'
+    tr_level: '0.0'
+    tr_mode: qtgui.TRIG_MODE_FREE
+    tr_tag: '""'
+    type: float
+    units: dB
+    update_time: '0.10'
+    width1: '2'
+    width10: '1'
+    width2: '1'
+    width3: '1'
+    width4: '1'
+    width5: '1'
+    width6: '1'
+    width7: '1'
+    width8: '1'
+    width9: '1'
+    wintype: firdes.WIN_BLACKMAN_hARRIS
+    ymax: '10'
+    ymin: '-140'
+  states:
+    bus_sink: false
+    bus_source: false
+    bus_structure: null
+    coordinate: [768, 356]
+    rotation: 0
+    state: true
+- name: qtgui_time_sink_x_0
+  id: qtgui_time_sink_x
+  parameters:
+    affinity: ''
+    alias: ''
+    alpha1: '1.0'
+    alpha10: '1.0'
+    alpha2: '1.0'
+    alpha3: '1.0'
+    alpha4: '1.0'
+    alpha5: '1.0'
+    alpha6: '1.0'
+    alpha7: '1.0'
+    alpha8: '1.0'
+    alpha9: '1.0'
+    autoscale: 'False'
+    axislabels: 'True'
+    color1: blue
+    color10: dark blue
+    color2: red
+    color3: green
+    color4: black
+    color5: cyan
+    color6: magenta
+    color7: yellow
+    color8: dark red
+    color9: dark green
+    comment: ''
+    ctrlpanel: 'False'
+    entags: 'True'
+    grid: 'False'
+    gui_hint: ''
+    label1: Signal 1
+    label10: Signal 10
+    label2: Signal 2
+    label3: Signal 3
+    label4: Signal 4
+    label5: Signal 5
+    label6: Signal 6
+    label7: Signal 7
+    label8: Signal 8
+    label9: Signal 9
+    legend: 'False'
+    marker1: '-1'
+    marker10: '-1'
+    marker2: '-1'
+    marker3: '-1'
+    marker4: '-1'
+    marker5: '-1'
+    marker6: '-1'
+    marker7: '-1'
+    marker8: '-1'
+    marker9: '-1'
+    name: '""'
+    nconnections: '1'
+    size: int(sample_rate_hz*2)
+    srate: sample_rate_hz
+    stemplot: 'False'
+    style1: '1'
+    style10: '1'
+    style2: '1'
+    style3: '1'
+    style4: '1'
+    style5: '1'
+    style6: '1'
+    style7: '1'
+    style8: '1'
+    style9: '1'
+    tr_chan: '0'
+    tr_delay: '0'
+    tr_level: '0.0'
+    tr_mode: qtgui.TRIG_MODE_FREE
+    tr_slope: qtgui.TRIG_SLOPE_POS
+    tr_tag: '""'
+    type: float
+    update_time: '0.10'
+    width1: '2'
+    width10: '1'
+    width2: '1'
+    width3: '1'
+    width4: '1'
+    width5: '1'
+    width6: '1'
+    width7: '1'
+    width8: '1'
+    width9: '1'
+    ylabel: Voltage
+    ymax: reference_voltage
+    ymin: '0'
+    yunit: '"V"'
+  states:
+    bus_sink: false
+    bus_source: false
+    bus_structure: null
+    coordinate: [768, 221]
+    rotation: 0
+    state: true
+
+connections:
+- [blocks_short_to_float_0, '0', qtgui_freq_sink_x_0, '0']
+- [blocks_short_to_float_0, '0', qtgui_time_sink_x_0, '0']
+- [epy_block_0, '0', blocks_short_to_float_0, '0']
+
+metadata:
+  file_format: 1