質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

3239閲覧

*SwiftUIで作成したアプリとArduinoの通信について

Keene

総合スコア1

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2020/09/02 07:35

編集2020/09/02 07:38

SwiftUIで作成したアプリとArduinoの通信をしたいと考えております。

SwiftUI→Arduinoの一方向です。
通信方法は、BLEでもOSC通信でもシリアル通信でも、なんでもかまいません。Developer(ESP-WROOM-02開発ボード)など別売のものの購入なども考えております。

Swiftのstoryboardで作成したアプリとArduinoの通信例はいくつかみかけましたが、SwiftのswiftUIで作成したアプリとArduinoの通信例は見つからず、大変困っております。

スマホアプリでタッチされたタッチ位置を取得し、これを変数 @State var xPos: CGFloat = 0,@State var yPos: CGFloat = 0に代入しています。この二つの値xPos,yPosをArduinoに送りたいと言うわけです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Arduinoの試す環境がないのでコンパイルも通していないコードで恐縮ですが、考え方だけ参考にしていただければと思います。

「SwiftUIでタップした座標を取りたい」と「SwiftUIでシリアル通信を実装したい」と複数の質問があるのではないでしょうか。

まず、SwiftUIでタッチイベントを取得する方法としては下記のリンクを参考にしてください。

シリアル通信の実装としては接続・通信と二段階踏む必要があるかと思います。

シリアル通信そのものについては詳しくないので別途調べていただくとして、SwifUIで送信するトリガーがわからないということであれば、ボタンタップ時に通信を開始させるようにすればよいかと思います。

swift

1struct HomeView : View { 2 var body: some View { 3 Button(action: { 4 // ここでシリアル通信を開始する 5 }, label: { 6 Text("シリアル通信の開始") 7 }) 8 } 9}

接続後タッチイベントをトリガーに送信するのであれば、前述した方法でタッチイベントを実装していただくのが良いかと思います。

また通信が逆向きの場合ですと、シリアル通信をおこなうObservableObjectを使用して、シリアル通信で得た結果とSwiftUI側のラベルを同期させることができるかと思います。

swift

1import SwiftUI 2import Combine 3 4final class FooObject : ObservableObject { 5 6 @Published var xPos: CGFloat = 0 7 8 func startSensor() { 9 // シリアル通信を開始 10 } 11 12 func onChanged(result: HogeObject) { 13 // ここで通信結果をつけとるとする 14 xPos = result.x 15 } 16}

ホーム画面では遷移時・またはボタンを押した時に object.startSensor() を実行するイメージです。

swift

1struct HomeView : View { 2 3 @State private var object: FooObject = FooObject() 4 5 var body: some View { 6 Text(object.xPos) 7 } 8}

投稿2020/09/03 02:45

ch3cooh

総合スコア287

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Keene

2020/09/05 11:58

非常に丁寧にありがとうございます ご指摘をいただき、現在のswiftUIのコードは以下のようになっております。 import SwiftUI struct ContentView: View { @State private var word: String = "" @State var xPos: CGFloat = 0 @State var yPos: CGFloat = 0 var body: some View { ZStack{ Image(systemName: "") .resizable() .padding() .gesture(DragGesture(minimumDistance: 0, coordinateSpace: .global).onChanged { dragGesture in self.xPos = dragGesture.location.x self.yPos = dragGesture.location.y print(self.xPos,self.yPos) print(dragGesture.translation) print("シリアル通信の開始") //ここでシリアル通信を開始する } .onEnded {dragGesture in self.xPos = dragGesture.location.x self.yPos = dragGesture.location.y print("Last",self.xPos,self.xPos) print("Last",dragGesture.translation) print("シリアル通信の開始") //ここでシリアル通信を開始する }) VStack{ HStack{ Text("(xPos)") Text("(yPos)") } VStack { TextField("発語せよ", text: $word) .textFieldStyle(RoundedBorderTextFieldStyle()) // 入力域のまわりを枠で囲む .padding() // 余白を追加 Text("(word)") .onReceive(NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)) { _ in print("Moving to the background!") } } } } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } } プログラム中の//ここでシリアル通信を開始するでシリアル通信をじっさいにするプログラムを実装する、というカタチがいい、ということでしょうか? たびたび申し訳ありません
ch3cooh

2020/09/05 12:26

Keeneさんがどのようなアプリを作りたいかにかかってきますので、どのように通信するのが良いかはわかりかねます。すみません…… Keeneさんが書かれているように * タッチイベント(DragGesture)の都度にシリアル通信(接続+送信)をさせる のもアリかと思いますし、 * 画面が表示されたタイミングで接続、タッチイベントの度に座標を送信させる や * 接続ボタンを押したら接続、タッチイベントの度に座標を送信させる でも作りようはあるかと思います。ご自身の作りたいものによって都合の良いようにシリアル通信すればよいかと思います。
guest

0

「swift シリアル通信」でぐぐると記事がいくつも出てきますね

投稿2020/09/02 07:51

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問