🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Atmel Studio

Atmel Studioは、マイクロチップ・テクノロジー社が製造しているマイコンであるAVRやSAMのプログラミングを容易にするための統合開発環境です。同社が無料で提供しており、以前はAVR Studioと呼ばれていました。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1293閲覧

CdSセルを使ってLEDライトの明るさを制御するコード

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Atmel Studio

Atmel Studioは、マイクロチップ・テクノロジー社が製造しているマイコンであるAVRやSAMのプログラミングを容易にするための統合開発環境です。同社が無料で提供しており、以前はAVR Studioと呼ばれていました。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/11/30 01:21

編集2017/12/04 02:57

###前提・実現したいこと
AtmelStudioを使ってC言語のコードを書いています。
実装したいこととしては、CdSセルを使ってLEDライトの明るさを制御することです。
マイコンは「ATSAMl21E16B」を使用しています。
以下、コード作成の参考にしているサイトです。

SAM Port (PORT) Driver
Quick Start Guide for PORT - Basic

###発生している問題・エラーメッセージ
Lチカを行うことはできたのですが、ここからどのようにCdSセルで制御するためのコードにしていけば良いかわからず困っています。

###該当のソースコード
Lチカのコード

C

1/** 2 * \file 3 * 4 * \brief Empty user application template 5 * 6 */ 7/** 8 * \mainpage User Application template doxygen documentation 9 * 10 * \par Empty user application template 11 * 12 * Bare minimum empty user application template 13 * 14 * \par Content 15 * 16 * -# Include the ASF header files (through asf.h) 17 * -# Minimal main function that starts with a call to system_init() 18 * -# "Insert application code here" comment 19 * 20 */ 21/* 22 * Include header files for all drivers that have been imported from 23 * Atmel Software Framework (ASF). 24 */ 25/* 26 * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a> 27 */ 28#include <asf.h> 29#define LED_0_PIN 16 30 31void configure_port_pins(void); 32int main (void) 33{ 34 system_init(); 35 configure_port_pins(); 36 /* Insert application code here, after the board has been initialized. */ 37 while (true) { 38 bool pin_state = 1; 39 port_pin_set_output_level(LED_0_PIN, pin_state); 40 } 41} 42void configure_port_pins(void) 43{ 44 struct port_config config_port_pin; 45 port_get_config_defaults(&config_port_pin); 46 config_port_pin.direction = PORT_PIN_DIR_OUTPUT; 47 port_pin_set_config(LED_0_PIN, &config_port_pin); 48} 49

###試したこと
Arduino開発環境でCdSセルを使ってLEDライトの明るさを制御するということは行いました。
以下参考資料です。

C++

1int val=0; //入力される値を格納する為の変数 2void setup() { 3Serial.begin(9800); //モニターに出力するための設定 4} 5void loop() { 6//ANALOG INの0番ピンからデータを受け付ける 7val=analogRead(0); 8Serial.println(val/4); //入力された値をモニターに出力 9analogWrite(3,val/4); //入力された値÷4の値をアナログ出力する 10delay(100); 11}

Arduinoで光センサLED制御

###補足情報(言語/FW/ツール等のバージョンなど)
回路では2ピンにCdSセルが、16ピンにLEDライトが繋がっています。

使用しているマイコンの写真
イメージ説明

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

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

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

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

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

coco_bauer

2017/11/30 09:21

ATMEL21E16Bというマイコンは市販されているようなものなのですか? Googleで”ATMEL21E16B”を検索すると、出てくるのはranranwayさんの質問3つだけなんですが。
退会済みユーザー

退会済みユーザー

2017/12/02 07:49

コメントいただきましてありがとうございます。市販されていると思います。質問の補足に写真を加えましたので、確認いただけますと幸いです。
ozwk

2017/12/03 01:13 編集

atsaml21e16bですね。あまり関係ないですが画像見ると何本か足浮いてそうで不安になりますね
guest

回答3

0

回答じゃなく補足質問なんですが、n=0なら真っ暗/n=255なら100%テカテカにLEDを光らせる関数
void led(unsigned char n) を書けますか? (PWMでやれそうに思えるけど)

これができるなら、CdSから手に入れた値を0~255にスケーリングしてこいつの引数に与えるだけっしょ。

投稿2017/11/30 05:00

episteme

総合スコア16612

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

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

退会済みユーザー

退会済みユーザー

2017/11/30 09:21

ご回答いただきましてありがとうございます。 void led(unsigned char n)の書き方は分からないです。
guest

0

AT SAM L21Eのデータシート を見ると、このチップは12bitのADコンバータと12bitのDAコンバータを内蔵しています。

だとすれば、2pinをADコンバータの入力に、16pinをDAコンバータの出力に、それぞれ接続されるようにチップを構成し、ADコンバータから得られた値を処理してDAコンバータに設定するループを書けば、質問にあるArduinoのコードと類似した動作をすると思います。

=助言=
まず、チップの品番をちゃんとチェックしましょう!
チップのメーカーと品番が判ったら、メーカーのサイトでデータシートなどの技術資料を探しましょう!
チップ周辺の回路を確認しましょう! 「回路では2ピンにCdSセルが、16ピンにLEDライトが繋がっています」と書かれていますが、この回路とArduinoの回路が同じとは限りません。(例えば、ピンにLEDのアノードが接続されていてピンから電流を流し出す方法と、ピンにLEDのカソードが接続されていてピンから電流を吸い込む方式があり点灯させかたが異なります。)

投稿2017/12/05 01:21

coco_bauer

総合スコア6915

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

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

退会済みユーザー

退会済みユーザー

2017/12/05 06:17

ご回答いただきましてありがとうございます。
guest

0

ベストアンサー

点滅しか出来ないLEDで階調表示を行うには高速で点滅させます。人間は毎秒100回あたり以上の頻度の点滅は、点滅ではなく暗く点灯していると認識します。

つまり、たとえば100階調で調光したい場合、明るさを nとすると、
1万分のn秒間点灯、1万分の(100-n)秒間消灯、を繰り返せば良い。
というのが一応の基本です。
手段としては
・ソフトウェアでのループカウントで時間をつぶす
・CPU内臓タイマー機能を使う
・タイマー割り込みを使う
・GPIOにPWM機能がついていればそれを使う
など。

ただし、CdSの線形性(明るさと正比例の計測値になるのか?)とかの補正などいろいろ細かい難しいところはまだあります。

投稿2017/11/30 14:57

a_saitoh

総合スコア702

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

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

退会済みユーザー

退会済みユーザー

2017/12/02 07:52

ご回答いただきましてありがとうございます。 初心者なので、十分に理解できなかったのですが、まず何から始めれば良いのかアドバイスをいただけますと幸いです。
a_saitoh

2017/12/02 15:53

アドバイスが理解できるようになる。 つまり、もう、あとはネット検索すればいくらでも自力で発見できるところまでアドバイスが得られているのですよ。↑の回答のPWMという言葉をみて、PWMで検索してみるとか、arduinoの内蔵I/OにPWM機能があるかどうか調べるとか、そういう態度を身につけるのが最初ではないかなぁ。
退会済みユーザー

退会済みユーザー

2017/12/04 02:57

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問