Чтение байтов из GPIO Pin и преобразование в int с помощью Python / Bitmodification - PullRequest
0 голосов
/ 11 марта 2019

В настоящее время я работаю с двумя микроконтроллерами, один из серии MSP430, используемый для AD-преобразования, и один Raspberry Pi Zero W. Система должна использоваться в эксперименте, который будет запущен в стратосферу на следующей неделе.MSP430G2553 должен считывать данные со счетчика Гейгера и отправлять их в Pi, используя побитовое значение.Код Энергии отлично работает.Raspberry Pi теперь должен прочитать байты, передаваемые через GPIO, и преобразовать цифровой входной сигнал в читаемый человеком код.Это та часть, где что-то не так.Мы протестировали наш код Python 3 без контроллера MSP, подключенного к Pi, и принимаем уже данные (!) (Скорость счета высока, если мы находимся в центре атомной электростанции).Так что тут действительно что-то не так.Я думаю, что проблема где-то в преобразовании входящих байтов в читаемый человеком код, но даже проверяя много статей, я не могу найти никакого решения для этого.Проблемный раздел должен быть таким:

input = GPIO.input(8)
input_value = int.from_bytes(b'input', byteorder=sys.byteorder)

Хотя другая часть кода, кажется, работает, я также прикрепляю ее здесь:

# coding: utf-8

# In[1]:


#!/usr/bin/python

import RPi.GPIO as GPIO
import os
import datetime
import time
import sys
from collections import Counter

GPIO.setwarnings(False) #read import from GPIO pin
GPIO.setmode(GPIO.BOARD)
GPIO.setup(8, GPIO.IN)
GPIO.setup(3, GPIO.OUT)
input = GPIO.input(8)
input_value = int.from_bytes(b'input', byteorder=sys.byteorder) #convert incoming digital signal to int
GPIO.output(3, GPIO.HIGH)
v = input_value * (3.0 / 1023.0) #conversion factor for voltage signal according to MSP430 handbook
vcount = 3.4

while True:
    now = datetime.datetime.now()
    curtime = now.strftime("%m/%d/%Y, %H:%M:%S")
    endTime = datetime.datetime.now() + datetime.timedelta(seconds=60)

    #use inner loop to count, how often the Geiger counter has received a alpha, beta or gamma photon within one minute. The ADC MSP430 sends a digital voltage count every 100 milliseconds to the Pi and the Pi writes a 1 into a list every time the voltage measured is higher than the background voltage (which means that a photon has been detected.) This part of the code is working.
    while True: 
        countfile = open('/home/pi/Desktop/countfile.txt', 'a')
        if v >= vcount:
            countfile.write('1')
        else:
            pass
        countfile.close()
        if datetime.datetime.now() >= endTime:
            break #end inner loop after 60 seconds

    #use outer loop to check how often a particle has been counted within one minute and write those counts per minute to a csv file. This part of the code is completely working.
    countfile = open('/home/pi/Desktop/countfile.txt', 'r')
    countdata = countfile.read()
    cpmc = Counter(countdata)
    for number in ('1'):
        cpm = '%s : %d' % (number, cpmc[number])
    Geigerdata = open('/home/pi/Desktop/Geigerdata.csv', 'a')
    Geigerdata.write('CPM= ' + cpm + ', Time= ' + curtime + '\n')
    Geigerdata.close()
    countfile.close()
    countfile = open('/home/pi/Desktop/countfile.txt', 'w')
    countfile.write('0')
    countfile.close() 

И, наконец, код Energia в Cиспользуется для AD-преобразования сигнала:

 #include "Energia.h"
    int sensorPin = A4;

    int v=0; 
    int outputPin = 1.6;

    void setup() {


        Serial.begin(9600);
        }

    void loop() {
       v = analogRead(sensorPin);
       for (int outputPin = 0; outputPin < 10; outputPin++){
       int bit = v & (1<<outputPin);
       digitalWrite(outputPin, bit);
    }
    delay(100);
  }

Я просто прикрепляю это для справки, чтобы вы знали, как должны выглядеть байты, которые получает Pi.Я был бы очень признателен за помощь сообщества, потому что у нас действительно не хватает времени и у нас нет эксперта по компьютерам в нашей исследовательской команде.Большое спасибо!

...