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

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

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

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

Q&A

解決済

2回答

6039閲覧

Arduino UnoでうまくいったプログラムをNanoで動かしたいい

HiroPokeHero

総合スコア45

Arduino

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

0グッド

0クリップ

投稿2019/07/06 07:08

編集2019/07/20 05:48

Arduino UnoでうまくいったプログラムをNanoで動かしたいのですが、
ボードの選択以外にやるべきことはありますか?

エラーになてしまいました。
また、使っているのは互換機で、CH340Gのチップを使っています。

前提・実現したいこと

Arduino NanoでCAN通信とLCD表示
ここで質問したいのはArduino UnoからNanoへの移植

発生している問題・エラーメッセージ

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src\SPI.cpp: In function 'begin': C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src\SPI.cpp:64:1: internal compiler error: Segmentation fault } ^ Please submit a full bug report, with preprocessed source if appropriate. See <http://gcc.gnu.org/bugs.html> for instructions. lto-wrapper.exe: fatal error: C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc returned 1 exit status compilation terminated. c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/bin/ld.exe: error: lto-wrapper failed collect2.exe: error: ld returned 1 exit status exit status 1 ボードArduino Nanoに対するコンパイル時にエラーが発生しました。

該当のソースコード

#include <mcp_can.h> #include <mcp_can_dfs.h> #include <SPI.h> long unsigned int CAN1Id = 0x100, CAN2Id = 0x101; unsigned char len = 0; unsigned char rxBuf[8]; char msgString[128]; // Array to store serial string int i = 0; // PinSetting #define CS_PIN1 10 // CS1 #define INT_PIN1 9 // INT1 #define CS_PIN2 8 // CS2 #define INT_PIN2 7 // INT2 MCP_CAN CAN1(CS_PIN1); MCP_CAN CAN2(CS_PIN2); void setup() { // put your setup code here, to run once: Serial.begin(9600); Serial.print("Begin CAN Training => "); // Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled. if(CAN1.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) == CAN_OK) Serial.println("MCP2515 No.1 Initialized Successfully!"); else Serial.println("Error Initializing MCP2515 No.1..."); CAN1.setMode(MCP_NORMAL); // Change to normal mode to allow messages to be transmitted if(CAN2.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) == CAN_OK) Serial.println("MCP2515 No.2 Initialized Successfully!"); else Serial.println("Error Initializing MCP2515 No.2..."); CAN2.setMode(MCP_NORMAL); // Change to normal mode to allow messages to be transmitted pinMode(INT_PIN1, INPUT); pinMode(INT_PIN2, INPUT); Serial.println("[Start ....]"); } byte data1[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; byte data2[8] = {0x00, 0x0F, 0xF2, 0xF3, 0x04, 0x05, 0x06, 0x07}; void loop() { // put your main code here, to run repeatedly: i++; if(i == 5) i = 0; if (i == 2) { // send data: ID = 0x100, Standard CAN1 Frame, Data length = 8 bytes, 'data' = array of data bytes to send byte sndStat = CAN1.sendMsgBuf(CAN1Id, 0, 8, data1); Serial.println("Sending from CAN No.1"); if(sndStat == CAN_OK){ Serial.println(" => Message Sent Successfully!"); } else { Serial.println(" => Error Sending Message..."); } } if (i == 4) { // send data: ID = 0x100, Standard CAN1 Frame, Data length = 8 bytes, 'data' = array of data bytes to send byte sndStat = CAN1.sendMsgBuf(CAN2Id, 0, 8, data2); Serial.println("Sending from CAN No.2"); if(sndStat == CAN_OK){ Serial.println(" => Message Sent Successfully!"); } else { Serial.println(" => Error Sending Message..."); } } if(!digitalRead(INT_PIN1)) // If CAN2_INT pin is low, read receive buffer { CAN2.readMsgBuf(&CAN2Id, &len, rxBuf); // Read data: len = data length, buf = data byte(s) if((CAN2Id & 0x80000000) == 0x80000000) // Determine if ID is standard (11 bits) or extended (29 bits) sprintf(msgString, " Extended ID: 0x%.8lX ", (CAN2Id & 0x1FFFFFFF)); else sprintf(msgString, " Standard ID: 0x%.3lX ", CAN2Id); Serial.print("Message Recieved Successfully! =>"); Serial.println(msgString); sprintf(msgString, "DLC: %1d Data:", len); Serial.print(msgString); //Serial.print(" DLC: %1d Data:", len); if((CAN2Id & 0x40000000) == 0x40000000){ // Determine if message is a remote request frame. sprintf(msgString, " REMOTE REQUEST FRAME"); Serial.print(msgString); } else { for(byte i = 0; i<len; i++){ sprintf(msgString, " 0x%.2X", rxBuf[i]); Serial.print(msgString); } } Serial.println(""); Serial.println(""); } if(!digitalRead(INT_PIN2)) // If CAN2_INT pin is low, read receive buffer { CAN2.readMsgBuf(&CAN1Id, &len, rxBuf); // Read data: len = data length, buf = data byte(s) if((CAN1Id & 0x80000000) == 0x80000000) // Determine if ID is standard (11 bits) or extended (29 bits) sprintf(msgString, " Extended ID: 0x%.8lX ", (CAN1Id & 0x1FFFFFFF)); else sprintf(msgString, " Standard ID: 0x%.3lX ", CAN1Id); Serial.print("Message Recieved Successfully! =>"); Serial.println(msgString); sprintf(msgString, "DLC: %1d Data:", len); Serial.print(msgString); //Serial.print(" DLC: %1d Data:", len); if((CAN1Id & 0x40000000) == 0x40000000){ // Determine if message is a remote request frame. sprintf(msgString, " REMOTE REQUEST FRAME"); Serial.print(msgString); } else { for(byte i = 0; i<len; i++){ sprintf(msgString, " 0x%.2X", rxBuf[i]); Serial.print(msgString); } } Serial.println(""); Serial.println(""); delay(100); // send data per 100ms } }

試したこと

Arduino Unoでの動作確認
⇒正常動作
2つのCANシールドを準備し、お互いに送信と受信を確認。

これをArduino Nanoに置き換え接続しなおして、
ボード設定としてNanoを選択

補足情報(FW/ツールのバージョンなど)

OS  : Windows10、
IDE  : Arduino1.8.9
ボード: ArduinoUno

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

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

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

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

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

y_waiwai

2019/07/06 08:13

で、しつもんはなんでしょうか
HiroPokeHero

2019/07/06 08:36

おっしゃる通りですね。 修正します。
guest

回答2

0

ベストアンサー

エラーメッセージを見ると、コンパイラの内部エラー?とのことでいまいちはっきりしません
ArduinoIDEの環境設定で、より詳細な表示>コンパイルにチェックを入れてビルドし、そのでてきたメッセージを提示できませんかね

投稿2019/07/06 08:51

y_waiwai

総合スコア87719

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

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

HiroPokeHero

2019/07/06 08:56

ご連絡ありがとうございます。 コンパイルのエラーではなく、書き込みのエラーのようです。 avrdude: ser_open(): can't open device "\.\COM3": �w�肳�ꂽ�t�@�C�������‚���܂���B マイコンボードに書き込もうとしましたが、エラーが発生しました。 このページを参考にしてください。 http://www.arduino.cc/en/Guide/Troubleshooting#upload 確認してみます。
y_waiwai

2019/07/06 09:12

まあ、書き込みエラーならCOM番号の確認だけですね 基本的にUnoとnanoはCPUが同じなのでダメということはないでしょう
thkana

2019/07/06 09:43 編集

質問のエラーとは別のものですが、状況が変わった、ということですか? 現状では、COM3を開けないと言っているので、定番としてはUnoと差し替えてからシリアルポートを変更していないとか、CH340のドライバがちゃんと入っていないとかいうあたりの確認でしょう。
HiroPokeHero

2019/07/06 13:01

CHのドライバを入れないといけないようです。 ただ、CHのドライバがなぜかインストールできませんでした。
y_waiwai

2019/07/06 13:05

デバイスマネージャでポート(COMとLPT)の項目を開いておいて、Nanoを繋いだり外したりしたら、COMポートがでたりなくなったりするでしょうか。 それで出てくるならドライバは不要です
HiroPokeHero

2019/07/06 18:05

CHのドライバについて 何度かチャレンジするとインストールができました。 ただ、書き込み時のエラーはまだ残っています。 ’’’ avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x80 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x80 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x80 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x80 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x80 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x80 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x80 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x80 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x80 avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x80 マイコンボードに書き込もうとしましたが、エラーが発生しました。 このページを参考にしてください。 http://www.arduino.cc/en/Guide/Troubleshooting#upload ’’’
y_waiwai

2019/07/06 22:22

COM番号が間違ってるかCPU設定が間違ってるか。 #CPU設定をATMega328P(oldbootloader)にしてみるとか
HiroPokeHero

2019/07/07 01:14

少し状況が変わりました。 互換機でしたので、ブートローダが必要だったようです。 幸い私はUnoも持っているので、Unoを書き込み装置として使うことでブートローダの書き込み成功しました。 ただ、Serial通信で文字が化けています。 これに関しては何度か事例報告のぺーいがあったかと思いますので、 まずは自力で頑張ってみます。
thkana

2019/07/07 05:57

> ブートローダが必要だった それって不良品と言っていいレベルだと思いますけど、安い互換機だったらリスクのうち、なのかな。
HiroPokeHero

2019/07/07 10:24

その製品の場合ブートローダはそもそも必要だったようです。 私の知識がないばかりに皆さんのお手間をかけてしまいました。
thkana

2019/07/07 11:13

製品としてそういうのもあるんですね。情報ありがとうございます。 まずは動いてなによりでした。
guest

0

1.USBドライバが必要なので、ダウンロード&インストールしました。

http://www.wch.cn/download/CH341SER_EXE.html

2.Nanoの互換機はブートローダの書き込みが必要ですので、Unoをつかってブートローダを書き込みました。

以下参考にしたサイトです。

https://neo-sahara.com/wp/2018/06/03/arduino-nanoでarduino-nanoにbootloaderを書き込む。/
ここも
https://youtuber.byte.jp/pc/1323

投稿2019/07/07 01:25

HiroPokeHero

総合スコア45

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

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

HiroPokeHero

2019/07/07 01:27

y_waiwaiさん、thkanaさん> ご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問