variable or field '' declared void
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 808
arduinoで開発をしているのですが、
ballSensor:53:17: error: variable or field 'sendVector' declared void
void sendVector(vectorRT_t vectorRTa, vectorXY_t vectorXYa){
^
ballSensor:53:17: error: 'vectorRT_t' was not declared in this scope
ballSensor:53:39: error: 'vectorXY_t' was not declared in this scope
void sendVector(vectorRT_t vectorRTa, vectorXY_t vectorXYa){
^
ballSensor:74:39: error: 'ballCtrl' was not declared in this scope
void printPulseWidth(float pulseWidth[ballCtrl.numberOfBallSensors]){
^
exit status 1
variable or field 'sendVector' declared void
とエラーが出てしまいます。
どなたか解決法を教えていただけるとありがたいです。
code
//in ballSensor.ino
#include "BallSensorCtrl.hpp"
constexpr unsigned long baud = 115200;
BallSensorCtrl ballCtrl;
void setup(){
Serial.begin(baud);
}
float pulseWidth[ballCtrl.numberOfBallSensors] = {};
int i = 0;
unsigned long long previoustTime = millis();
//vectorRT_t previousVectorRT = {};
//vectorXY_t previousVectorXY = {};
void loop(){
float currentPulseWidth[ballCtrl.numberOfBallSensors] = {};
ballCtrl.getPulseWidth(currentPulseWidth);
static float rate = 0.05;
for(int i = 0;i<12;i++){
pulseWidth[i] = currentPulseWidth[i] * rate + pulseWidth[i] * (1 - rate);
}
vectorXY_t vectorXY = ballCtrl.CaluculateVectorXY(pulseWidth);
vectorRT_t vectorRT = ballCtrl.CaluculateVectorRT(pulseWidth);
//10msごと
if(millis() - previoustTime > 10){
//sendVectorRTIntBySerial(vectorRTInt);
Serial.print("radius : ");
Serial.print(vectorRT.radius);
Serial.print(" theta : ");
Serial.print(vectorRT.theta);
//printVectorRTIntBySerial(vectorRTInt, deltaVectorXYInt);
//printPulseWidth(pulseWidth);
previoustTime = millis();
//previousVectorRT = vectorRT;
//previousVectorXY = vectorXY;
}
//受け取った時
if (Serial.available()){
char header = Serial.read();
if(header == 'b'){
//int a = sendVector(vectorXY,vectorRT);
//printVectorRTIntBySerial(vectorRTInt, deltaVectorXYInt);
//printPulseWidth(pulseWidth);
//previousVectorRT = vectorRT;
//previousVectorXY = vectorXY;
}
}
//printPulseWidth(pulseWidth);
}
void sendVector(vectorRT_t vectorRTa, vectorXY_t vectorXYa){
float x = vectorXYa.x;
float y = vectorXYa.y;
float radius = vectorRTa.radius;
float theta = vectorRTa.theta;
/*Serial.write('B');
Serial.write(lowByte(radius));
Serial.write(highByte(radius));
Serial.write(lowByte(theta));
Serial.write(highByte(theta));
Serial.write(lowByte(x));
Serial.write(highByte(x));
Serial.write(lowByte(y));
Serial.write(highByte(y));*/
//return;
}
void printPulseWidth(float pulseWidth[ballCtrl.numberOfBallSensors]){
Serial.print(" 0 : ");
Serial.print(pulseWidth[0]);
Serial.print(" 1 : ");
Serial.print(pulseWidth[1]);
Serial.print(" 2 : ");
Serial.print(pulseWidth[2]);
Serial.print(" 3 : ");
Serial.print(pulseWidth[3]);
Serial.print(" 4 : ");
Serial.print(pulseWidth[4]);
Serial.print(" 5 : ");
Serial.print(pulseWidth[5]);
Serial.print(" 6 : ");
Serial.print(pulseWidth[6]);
Serial.print(" 7 : ");
Serial.print(pulseWidth[7]);
Serial.print(" 8 : ");
Serial.print(pulseWidth[8]);
Serial.print(" 9 : ");
Serial.print(pulseWidth[9]);
Serial.print(" 10 : ");
Serial.print(pulseWidth[10]);
Serial.print(" 11 : ");
Serial.print(pulseWidth[11]);
Serial.println();
}
//in BallSensorCtrl.cpp
#include <digitalWriteFast.h>
#include "BallSensorCtrl.hpp"
void BallSensorCtrl::setupSensors(){
pinMode(BallSensorPins[0],INPUT);
pinMode(BallSensorPins[1],INPUT);
pinMode(BallSensorPins[2],INPUT);
pinMode(BallSensorPins[3],INPUT);
pinMode(BallSensorPins[4],INPUT);
pinMode(BallSensorPins[5],INPUT);
pinMode(BallSensorPins[6],INPUT);
pinMode(BallSensorPins[7],INPUT);
pinMode(BallSensorPins[8],INPUT);
pinMode(BallSensorPins[9],INPUT);
pinMode(BallSensorPins[10],INPUT);
pinMode(BallSensorPins[11],INPUT);
}
void BallSensorCtrl::getPulseWidth(float pulseWidth[numberOfBallSensors]){
uint16_t timeLimit = IRBallWaveformModeA;
unsigned long startTime_us = micros();
do{
//全センサを同時読み
for (int i = 0; i < numberOfBallSensors/2; i++){
if (digitalReadFast(BallSensorPins[i]) == false)
{
pulseWidth[i] += deltaPulseWidth;
}
}
} while ((micros() - startTime_us) < timeLimit);
startTime_us = micros();
do{
//全センサを同時読み
for (int i = numberOfBallSensors/2; i < numberOfBallSensors; i++){
if (digitalReadFast(BallSensorPins[i]) == false)
{
pulseWidth[i] += deltaPulseWidth;
}
}
} while ((micros() - startTime_us) < timeLimit);
return;
}
vectorXY_t BallSensorCtrl::CaluculateVectorXY(float pulseWidth[numberOfBallSensors]){
vectorXY_t result;
result.x = 0;
result.y = 0;
for(int i = 0;i<numberOfBallSensors;i++){
result.x += pulseWidth[i] * UnitVectorX[i];
result.y += pulseWidth[i] * UnitVectorY[i];
}
/*if(result.x != 0 || result.y != 0){
float squared = result.x * result.x + result.y * result.y;
float root = sqrt(squared);
result.x /= root;
result.y /= root;
}*/
return result;
}
vectorRT_t BallSensorCtrl::CaluculateVectorRT(float pulseWidth[numberOfBallSensors]){
vectorRT_t returnValue;
vectorXY_t result;
result.x = 0;
result.y = 0;
float pulseWidthSum = 0;
for(int i = 0;i<numberOfBallSensors;i++){
result.x += pulseWidth[i] * UnitVectorX[i];
result.y += pulseWidth[i] * UnitVectorY[i];
pulseWidthSum += pulseWidth[i];
}
float sqrtRadius = sqrt(pulseWidthSum);
float cube = pulseWidthSum * sqrtRadius;
float rate;
if (cube > 0.0001)
rate = 1 / cube * 500;
else
rate = 0;
result.x *= rate;
result.y *= rate;
returnValue.theta = atan2(result.x,result.y);
returnValue.radius = result.x * result.x + result.y * result.y;
returnValue.radius /= 100;
return returnValue;
}
//in BallSensorCtrl.hpp
#ifndef BallCtrl_h
#define BallCtrl_h
typedef struct{
float radius;
float theta;
} vectorRT_t;
typedef struct{
float x;
float y;
} vectorXY_t;
class BallSensorCtrl{
public:
static constexpr int numberOfBallSensors = 12;
void setupSensors();
void getPulseWidth(float pulseWidth[numberOfBallSensors]);
vectorXY_t CaluculateVectorXY(float pulseWidth[numberOfBallSensors]);
vectorRT_t CaluculateVectorRT(float pulseWidth[numberOfBallSensors]);
//センサーのピン番号 今
//uint8_t BallSensorPins[numberOfBallSensors] = {9, 8, 7, 6, 5, 4, 3, 2, A2, A1, A0, 10};
//昔
uint8_t BallSensorPins[numberOfBallSensors] =
{A2, A1, 9, A0, 8, 5, 4, 3, 2, A5, A4, A3};
private:
static constexpr uint16_t IRBallWaveformModeA = 833;
static constexpr float deltaPulseWidth = 1.0;
float UnitVectorX[numberOfBallSensors] = {0.000, 0.500, 0.866, 1.000, 0.866, 0.500, 0.000, -0.500, -0.866, -1.000, -0.866, -0.500};
float UnitVectorY[numberOfBallSensors] = {1.000, 0.866, 0.500, 0.000, -0.500, -0.866, -1.000, -0.866, -0.500, 0.000, 0.500, 0.866};
};
#endif
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
BallSensorCtrl.cpp
BallSensorCtrl.hpp
は、ballSensor.ino と同じフォルダに置き #include <Arduino.h> を追加しコンパイル確認しました
digitalWriteFast.h は、ライブラリ追加が必要です。
//in BallSensorCtrl.cpp
#include <Arduino.h>
#include <digitalWriteFast.h>
#include "BallSensorCtrl.hpp"
//in BallSensorCtrl.hpp
#include <Arduino.h>
#ifndef BallCtrl_h
#define BallCtrl_h
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
ballSensor:53:17: error: 'vectorRT_t' was not declared in this scope
ballSensor:53:39: error: 'vectorXY_t' was not declared in this scope
vectorRT_t とvectorXY_tの定義がない、というエラーです
これらの定義はどこにあるんでしょうか
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる