Browse Source

sample digital signal

Fabian Peter Hammerle 3 years ago
parent
commit
c17cb20b82
3 changed files with 30 additions and 260 deletions
  1. 4 8
      arduino-sketch.ino
  2. 21 245
      scope.grc
  3. 5 7
      serial_source_block.py

+ 4 - 8
arduino-sketch.ino

@@ -1,17 +1,13 @@
 void setup() {
     // $ stty -F /dev/ttyUSB0 | grep speed
     Serial.begin(115200);
+    // A0 for compatibility with analog configuration
+    pinMode(A0, INPUT);
 }
 
 void loop() {
     // effective sample rate measured with "Probe Rate" block
     delayMicroseconds(800);
-    // > 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
-    // 16 bits/sample / 115200 Baud * 1e6 μs/sec = 139 μs/sample
-    Serial.write(reading >> 8);
-    Serial.write(reading & 0xff);
+    // $ tail --follow /dev/ttyUSB0 | od --format=u1 --width=1
+    Serial.write(digitalRead(A0));
 }

+ 21 - 245
scope.grc

@@ -32,28 +32,16 @@ options:
     state: enabled
 
 blocks:
-- name: reference_voltage
-  id: variable
-  parameters:
-    comment: ''
-    value: '4.11'
-  states:
-    bus_sink: false
-    bus_source: false
-    bus_structure: null
-    coordinate: [457, 222]
-    rotation: 0
-    state: true
 - name: sample_rate_hz
   id: variable
   parameters:
     comment: ''
-    value: '1044.4'
+    value: '1203.47'
   states:
     bus_sink: false
     bus_source: false
     bus_structure: null
-    coordinate: [58, 173]
+    coordinate: [408, 37]
     rotation: 0
     state: enabled
 - name: blocks_message_debug_0
@@ -66,7 +54,7 @@ blocks:
     bus_sink: false
     bus_source: false
     bus_structure: null
-    coordinate: [991, 817]
+    coordinate: [1130, 378]
     rotation: 0
     state: true
 - name: blocks_probe_rate_0
@@ -79,238 +67,30 @@ blocks:
     maxoutbuf: '0'
     minoutbuf: '0'
     mintime: '10000.0'
-    type: short
+    type: byte
     vlen: '1'
   states:
     bus_sink: false
     bus_source: false
     bus_structure: null
-    coordinate: [391, 781]
+    coordinate: [530, 342]
     rotation: 0
     state: true
-- name: blocks_short_to_float_0
-  id: blocks_short_to_float
+- name: blocks_uchar_to_float_0
+  id: blocks_uchar_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: [483, 324]
+    coordinate: [659, 234]
     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: 'False'
-    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: '0'
-    ymin: '-100'
-  states:
-    bus_sink: false
-    bus_source: false
-    bus_structure: null
-    coordinate: [898, 435]
-    rotation: 0
-    state: enabled
-- name: qtgui_number_sink_0
-  id: qtgui_number_sink
-  parameters:
-    affinity: ''
-    alias: ''
-    autoscale: 'False'
-    avg: '0'
-    color1: ("black", "black")
-    color10: ("black", "black")
-    color2: ("black", "black")
-    color3: ("black", "black")
-    color4: ("black", "black")
-    color5: ("black", "black")
-    color6: ("black", "black")
-    color7: ("black", "black")
-    color8: ("black", "black")
-    color9: ("black", "black")
-    comment: ''
-    factor1: '1'
-    factor10: '1'
-    factor2: '1'
-    factor3: '1'
-    factor4: '1'
-    factor5: '1'
-    factor6: '1'
-    factor7: '1'
-    factor8: '1'
-    factor9: '1'
-    graph_type: qtgui.NUM_GRAPH_HORIZ
-    gui_hint: ''
-    label1: Voltage
-    label10: ''
-    label2: ''
-    label3: ''
-    label4: ''
-    label5: ''
-    label6: ''
-    label7: ''
-    label8: ''
-    label9: ''
-    max: reference_voltage
-    min: '0'
-    name: '""'
-    nconnections: '1'
-    type: float
-    unit1: V
-    unit10: ''
-    unit2: ''
-    unit3: ''
-    unit4: ''
-    unit5: ''
-    unit6: ''
-    unit7: ''
-    unit8: ''
-    unit9: ''
-    update_time: '0.10'
-  states:
-    bus_sink: false
-    bus_source: false
-    bus_structure: null
-    coordinate: [922, 150]
-    rotation: 0
-    state: enabled
-- name: qtgui_number_sink_0_0
-  id: qtgui_number_sink
-  parameters:
-    affinity: ''
-    alias: ''
-    autoscale: 'False'
-    avg: '0'
-    color1: ("black", "black")
-    color10: ("black", "black")
-    color2: ("black", "black")
-    color3: ("black", "black")
-    color4: ("black", "black")
-    color5: ("black", "black")
-    color6: ("black", "black")
-    color7: ("black", "black")
-    color8: ("black", "black")
-    color9: ("black", "black")
-    comment: ''
-    factor1: '1'
-    factor10: '1'
-    factor2: '1'
-    factor3: '1'
-    factor4: '1'
-    factor5: '1'
-    factor6: '1'
-    factor7: '1'
-    factor8: '1'
-    factor9: '1'
-    graph_type: qtgui.NUM_GRAPH_HORIZ
-    gui_hint: ''
-    label1: ''
-    label10: ''
-    label2: ''
-    label3: ''
-    label4: ''
-    label5: ''
-    label6: ''
-    label7: ''
-    label8: ''
-    label9: ''
-    max: '1024'
-    min: '0'
-    name: '"Arduino Reading"'
-    nconnections: '1'
-    type: short
-    unit1: ''
-    unit10: ''
-    unit2: ''
-    unit3: ''
-    unit4: ''
-    unit5: ''
-    unit6: ''
-    unit7: ''
-    unit8: ''
-    unit9: ''
-    update_time: '0.10'
-  states:
-    bus_sink: false
-    bus_source: false
-    bus_structure: null
-    coordinate: [452, 503]
-    rotation: 0
-    state: disabled
 - name: qtgui_time_sink_x_0
   id: qtgui_time_sink_x
   parameters:
@@ -397,15 +177,15 @@ blocks:
     width7: '1'
     width8: '1'
     width9: '1'
-    ylabel: Voltage
-    ymax: reference_voltage
+    ylabel: Signal
+    ymax: '1'
     ymin: '0'
-    yunit: '"V"'
+    yunit: '""'
   states:
     bus_sink: false
     bus_source: false
     bus_structure: null
-    coordinate: [897, 292]
+    coordinate: [959, 186]
     rotation: 0
     state: enabled
 - name: serial_source_block
@@ -414,16 +194,15 @@ blocks:
     _source_code: "import gnuradio\nimport numpy\nimport serial\n\n\nclass SerialSourceBlock(gnuradio.gr.sync_block):\n\
       \    def __init__(\n        self, port=\"/dev/ttyUSB0\", baud_rate=115200, buffer_max_length=10,\
       \ timeout=2\n    ):\n        gnuradio.gr.sync_block.__init__(\n            self,\
-      \ name=\"Serial Source Block\", in_sig=None, out_sig=[numpy.int16]\n       \
+      \ name=\"Serial Source Block\", in_sig=None, out_sig=[numpy.uint8]\n       \
       \ )\n        self._serial_port = serial.Serial(\n            port=port, baudrate=baud_rate,\
       \ bytesize=serial.EIGHTBITS, timeout=timeout\n        )\n        self._buffer_max_length\
       \ = buffer_max_length\n\n    def work(self, input_items, output_items):\n  \
       \      # pylint: disable=unused-argument\n        buffer = self._serial_port.read(\n\
-      \            2 * min(len(output_items[0]), self._buffer_max_length)\n      \
-      \  )\n        assert len(buffer) % 2 == 0\n        buffer_samples_count = len(buffer)\
-      \ // 2\n        output_items[0][:buffer_samples_count] = numpy.frombuffer(buffer,\
-      \ dtype=\">u2\")\n        assert output_items[0][:buffer_samples_count].max()\
-      \ < 1024, \"lost sync?\"\n        return buffer_samples_count\n"
+      \            min(len(output_items[0]), self._buffer_max_length)\n        )\n\
+      \        output_items[0][: len(buffer)] = numpy.frombuffer(buffer, dtype=\"\
+      u1\")\n        assert output_items[0][: len(buffer)].max() <= 1, \"invalid value\"\
+      \n        return len(buffer)\n"
     affinity: ''
     alias: ''
     baud_rate: '115200'
@@ -436,22 +215,19 @@ blocks:
   states:
     _io_cache: ('Serial Source Block', 'SerialSourceBlock', [('port', "'/dev/ttyUSB0'"),
       ('baud_rate', '115200'), ('buffer_max_length', '10'), ('timeout', '2')], [],
-      [('0', 'short', 1)], '', [])
+      [('0', 'byte', 1)], '', [])
     bus_sink: false
     bus_source: false
     bus_structure: null
-    coordinate: [15, 276]
+    coordinate: [28, 170]
     rotation: 0
     state: true
 
 connections:
 - [blocks_probe_rate_0, rate, blocks_message_debug_0, print]
-- [blocks_short_to_float_0, '0', qtgui_freq_sink_x_0, '0']
-- [blocks_short_to_float_0, '0', qtgui_number_sink_0, '0']
-- [blocks_short_to_float_0, '0', qtgui_time_sink_x_0, '0']
+- [blocks_uchar_to_float_0, '0', qtgui_time_sink_x_0, '0']
 - [serial_source_block, '0', blocks_probe_rate_0, '0']
-- [serial_source_block, '0', blocks_short_to_float_0, '0']
-- [serial_source_block, '0', qtgui_number_sink_0_0, '0']
+- [serial_source_block, '0', blocks_uchar_to_float_0, '0']
 
 metadata:
   file_format: 1

+ 5 - 7
serial_source_block.py

@@ -8,7 +8,7 @@ class SerialSourceBlock(gnuradio.gr.sync_block):
         self, port="/dev/ttyUSB0", baud_rate=115200, buffer_max_length=10, timeout=2
     ):
         gnuradio.gr.sync_block.__init__(
-            self, name="Serial Source Block", in_sig=None, out_sig=[numpy.int16]
+            self, name="Serial Source Block", in_sig=None, out_sig=[numpy.uint8]
         )
         self._serial_port = serial.Serial(
             port=port, baudrate=baud_rate, bytesize=serial.EIGHTBITS, timeout=timeout
@@ -18,10 +18,8 @@ class SerialSourceBlock(gnuradio.gr.sync_block):
     def work(self, input_items, output_items):
         # pylint: disable=unused-argument
         buffer = self._serial_port.read(
-            2 * min(len(output_items[0]), self._buffer_max_length)
+            min(len(output_items[0]), self._buffer_max_length)
         )
-        assert len(buffer) % 2 == 0
-        buffer_samples_count = len(buffer) // 2
-        output_items[0][:buffer_samples_count] = numpy.frombuffer(buffer, dtype=">u2")
-        assert output_items[0][:buffer_samples_count].max() < 1024, "lost sync?"
-        return buffer_samples_count
+        output_items[0][: len(buffer)] = numpy.frombuffer(buffer, dtype="u1")
+        assert output_items[0][: len(buffer)].max() <= 1, "invalid value"
+        return len(buffer)