В настоящее время я работаю с двумя микроконтроллерами, один из серии 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.Я был бы очень признателен за помощь сообщества, потому что у нас действительно не хватает времени и у нас нет эксперта по компьютерам в нашей исследовательской команде.Большое спасибо!