91163
現在，pythonで計算した値，例えば，pi=3.141592 をArduinoに渡そうと考えています．(とりあえずはI2Cで）  
今回は「piを4bytesに分ける」「分けて送信して後でArduinoが4byte繋げる」ということを目標にしています．strに直す方法などもありますが，自分の勉強のためにこの方法で進めようと思っています．

そこで，わからない点が，「Python上でpiをどうすれば，Arduinoが後から読める形にできるのか」ということです．例えば，piを
structのpackメソッドを使って，f(32bit float)の4バイトの配列を作りました

```

    from struct import pack
    pi=3.141592
    b=pack("f",　pi)
    
```

これで，Arduinoが後から読める形になったと思います．なので後はこの配列を順番にわたします．

```

    bus.write(adress, b[0])
    bus.write(adress, b[1])
    bus.write(adress, b[2])
    bus.write(adress, b[3])
    
```

後は，Arduio側ではbitシフトをしながら繋げていくだけで,
floatとしてpiが受け取れるはずです．しかし，うまくいきません．原因は受け取る側（arduino)にも考えられるかもしれませんが，別の実験でうまく動いたプログラムなので，Arduinoには問題がないと仮定してそのプログラムは割愛します．  
とにかく，現在私の中で問題があるのではないかと思うのが，繰り返しになりますが，

「 Python上でpiを，Arduinoが後から読める形に変換できていない」「あるいは変換できているけれど，分割して送れていない」

ということです．必ずしもこのコードを訂正していただく必要はなく，皆様の知っている変換方法，分割方法も教えて下さいませ

よろしくお願いします
CC BY-SA 4.0
2022-09-18T09:00:10.940
91156
2022-09-18T15:11:03.710
41334
question
python c++ c raspberry-pi arduino
Python上の小数を含む数を，Arduinoが扱える形に成形したいです．
> ということです．必ずしもこのコードを訂正していただく必要はなく，皆様の知っている変換方法，分割方法も教えて下さいませ

文字列で渡してそこから変換すればよろしいかと。
CC BY-SA 4.0
2022-09-18T12:59:02.337
91159
2022-09-18T12:59:02.337
27481
91156
answer
Pythonで作成したバイト列の内容を表示すると、Windowsでは以下のようになりますが、Raspberry Piではどうなっていますか？

```

    b'\xd8\x0fI@'
    
```

上記の順番が以下のように逆に表示されるなら：

```

    b'@I\x0f\xd8'
    
```

変換の際にエンディアンを明示的に指定してみれば良いと思われます。

```

    b=pack("<f", pi)
    
```

* * *

Arduinoのボードや環境は持っていないのでソースコード上の扱いになりますが、前回の回答で紹介した以下の記事を参考に、通信はしないで上記のバイト配列を即値で設定した場合にどのような値が表示されるでしょう？  
[Convert IEEE 754 32 to float](https://forum.arduino.cc/t/convert-
ieee-754-32-to-float/323109)

```

    union 
    {      byte b[4] ;
            float f ;
    } u ;
    
    u.b[0] = '\xd8' ;
    u.b[1] = '\x0f' ;
    u.b[2] = 'I' ;
    u.b[3] = '@' ;
    
    Serial.println( u.f ) ;
    
```

上記で表示が`3.141592`といったπの数値ではなく、別の値だったら、どこかで変換する処理が必要になるでしょう。  
上記でπの数値が正しく表示されるなら、Raspberry PiとArduinoの間の通信が何か上手くいっていない可能性があります。

ちなみにVC++で同様に以下のように作成・実行した場合は`3.141592`が表示されました。

```

    #include <stdio.h>
    
    int main(int argc, char** argv)
    {
        union {
            unsigned char b[4];
            float         f;
        } u;
    
        u.b[0] = '\xd8';
        u.b[1] = '\x0f';
        u.b[2] = 'I';
        u.b[3] = '@';
    
        printf("%f\n", u.f);
    }
    
```

* * *

そして質問ではRaspberry Pi, Pythonから`bus.write(adress,
b[0])`と言う風に送信していて、おそらく[smbus2](https://pypi.org/project/smbus2/)の`Example 5:
Single i2c_rdwr`あたりの書き方を参考にしているのでしょうが、微妙に合っていない(かつ記述が不足している)ようです。

上記PyPIページの記述に合わせるか、前回の回答で紹介した以下の記事のように、smbus2の(基となった？)少し前の[smbus](https://pypi.org/project/smbus/)のライブラリを使ってみてはどうでしょう？  
[Raspberry PiでI2C通信をする](https://www.raspberrypirulo.net/entry/raspberrypi-i2c)  
[ラズパイ（Raspberry Pi）とArduinoをI2Cで接続【基本編】
ラズパイからPythonのSMBusモジュールを使ってArduinoにデータを送信しよう](https://deviceplus.jp/raspberrypi/raspberry-
pi-and-arduino-connect-with-i2c-01/)
CC BY-SA 4.0
2022-09-18T15:11:03.710
91163
2022-09-18T15:11:03.710
26370
91156
answer