caramoan tour package

caramoan tour package

Author Topic: P-Bot Official Thread  (Read 16202 times)

Offline nokia3310

  • CR2032 Battery
  • **
  • Posts: 42
  • Pogi/Ganda Points: 1
Re: P-Bot Official Thread
« Reply #360 on: February 29, 2012, 08:37:42 PM »
mukhang ok naman, anong response nya nung tinest mo?yun bang line mo eh malapad?yung kaya nyang matakpan ang lahat ng sensors?

kasi iba din approach kung manipis yung lines, yung most of the time eh gitnang line lang ang natatakpan?

sir,, ung code ko,straight lng ang takbo ng pbot... di parin xa sumusunod sa linya.., pano bato..

Philippine Electronics Forum

Re: P-Bot Official Thread
« Reply #360 on: February 29, 2012, 08:37:42 PM »

Offline nokia3310

  • CR2032 Battery
  • **
  • Posts: 42
  • Pogi/Ganda Points: 1
Re: P-Bot Official Thread
« Reply #361 on: March 03, 2012, 03:19:48 PM »
kapag manipis imaginine nyo ano response?

1.kapag gitnang line lang ang triggered, diretso lang ang takbo,
2. kapag nasa kanan ang linya,titigil ang kanang motor(or turn right)
3. kapag nasa kaliwa ang linya, titigil ang kaliwang motor(or turn right)
in short ang sinesense ng unang scheme eh kung pumapasok sa linya ang left or right sensor, ang pangalawang scheme eh dinedetect naman kung lumabas sa linya ang left at right sensors,


see the difference?

sir.. wala na bang mas mahina sa LOWSPEED sa pbot library?.. masyadong mabilis ang takbo, na overline xa.. medyu nkasense na xa ng black line.. sa code ko cguro ito,

Code: [Select]
#define KUL_LINESENSOR_DEBOUNCE_MS    10

unsigned long ulLineSensorDebounce;
boolean blLineDetected;
para san nga ba tong code nyu sa sumobot?..

Philippine Electronics Forum

Re: P-Bot Official Thread
« Reply #361 on: March 03, 2012, 03:19:48 PM »

Offline glutnix_neo

  • Technical People
  • Nuclear Reactor
  • *****
  • Posts: 4162
  • Pogi/Ganda Points: 166
  • Gender: Female
  • A journey to a thousand lines begins w/ LED Blink
    • Underground Workbench
Re: P-Bot Official Thread
« Reply #362 on: March 03, 2012, 03:36:09 PM »


sir.. wala na bang mas mahina sa LOWSPEED sa pbot library?.. masyadong mabilis ang takbo, na overline xa.. medyu nkasense na xa ng black line.. sa code ko cguro ito,

Code: [Select]
#define KUL_LINESENSOR_DEBOUNCE_MS    10

unsigned long ulLineSensorDebounce;
boolean blLineDetected;
para san nga ba tong code nyu sa sumobot?..


pwede mo iset manually yung speed between 0 to 255 instead of using constants e.g. moveForward(100)


yung 10ms is validation delay ng mga line sensors para masiguradong consistent ang input after 10mS, this is to eliminate false triggering due to noise. kung ako tatanungin medyo mild pa yang measure ko na yan, kung talagang noisy ang system dapat magprovide din ang programmer ng sariling routine.
If we hear,we forget;if we see, we remember;if we do,we understand.
Let's support the use of free and open source softwares...
http://UndergroundWorkbench.wordpress.com

Philippine Electronics Forum

Re: P-Bot Official Thread
« Reply #362 on: March 03, 2012, 03:36:09 PM »

Offline nokia3310

  • CR2032 Battery
  • **
  • Posts: 42
  • Pogi/Ganda Points: 1
Re: P-Bot Official Thread
« Reply #363 on: March 04, 2012, 12:45:25 PM »

pwede mo iset manually yung speed between 0 to 255 instead of using constants e.g. moveForward(100)


yung 10ms is validation delay ng mga line sensors para masiguradong consistent ang input after 10mS, this is to eliminate false triggering due to noise. kung ako tatanungin medyo mild pa yang measure ko na yan, kung talagang noisy ang system dapat magprovide din ang programmer ng sariling routine.

pwede po bang eapply ung code (validation delay) sa line follower sir?..

ah.. ok sir.. gets ko nah.. pwede lng pala e.set..
ito po ung vid ng pbot ko... medyu nkakasense na xa ng line pero di parin insakto ang takbo..



Philippine Electronics Forum

Re: P-Bot Official Thread
« Reply #363 on: March 04, 2012, 12:45:25 PM »

Offline glutnix_neo

  • Technical People
  • Nuclear Reactor
  • *****
  • Posts: 4162
  • Pogi/Ganda Points: 166
  • Gender: Female
  • A journey to a thousand lines begins w/ LED Blink
    • Underground Workbench
Re: P-Bot Official Thread
« Reply #364 on: March 04, 2012, 12:56:43 PM »
ambilis pala naman eh, hehehe

meron ng validation delay yan, kung gusto mo imodify pwede mo taasan pa value ng delay

#define KUL_LINESENSOR_DEBOUNCE_MS    10
If we hear,we forget;if we see, we remember;if we do,we understand.
Let's support the use of free and open source softwares...
http://UndergroundWorkbench.wordpress.com

Philippine Electronics Forum

Re: P-Bot Official Thread
« Reply #364 on: March 04, 2012, 12:56:43 PM »

Offline nokia3310

  • CR2032 Battery
  • **
  • Posts: 42
  • Pogi/Ganda Points: 1
Re: P-Bot Official Thread
« Reply #365 on: March 04, 2012, 02:13:39 PM »
ambilis pala naman eh, hehehe

meron ng validation delay yan, kung gusto mo imodify pwede mo taasan pa value ng delay

#define KUL_LINESENSOR_DEBOUNCE_MS    10

oo nga sir, pero di pa xa eksakrong nagpa follow sa line..

wala pa po sir.. di ko kasi alam kung pano e.incorporate ung validation delay code sa code ko po...ehehe pasenxa po..,pano ba gamitin ung validition delay code?..
ito po ung code ko po...
Code: [Select]
#include <PBot.h>

PBotClass  LineKeepDistance;

void setup()
{
  LineKeepDistance.begin(LINETRACKING,WHITE,BLACK);                                                 
}

void loop()
{
  int LineState;
 
  LineState = LineKeepDistance.detectLine();
 
  if(LINE_LEFT==LineState)
  {
    LineKeepDistance.turnLeft(100);
  }
  else if (LINE_LEFTCENTER==LineState)
  {
    LineKeepDistance.turnLeft(100);
  }
  else if (LINE_CENTER==LineState)
  {
    LineKeepDistance.moveForward(100);
  }
  else if(LINE_RIGHT==LineState)
  {
    LineKeepDistance.turnRight(100);
  }
  else if (LINE_RIGHTCENTER==LineState)
  {
    LineKeepDistance.turnRight(100);
  }
 
  else if(NO_LINE==LineState)
  {
    LineKeepDistance.stopMotors();
   
  }
 
}

Offline nokia3310

  • CR2032 Battery
  • **
  • Posts: 42
  • Pogi/Ganda Points: 1
Re: P-Bot Official Thread
« Reply #366 on: March 14, 2012, 02:35:27 PM »
post ko lng code sa pbot..ito po ung code ko using the Pbot library..  ;D line follower po ito tapos hihinto po xa pagmayobstacle at pag walang line ang nasesense..
tnx sir glutnix_neo..
Code: [Select]
#include <PBot.h>

PBotClass  LineKeepDistance;

void setup()
{
  LineKeepDistance.begin(LINETRACKING,WHITE,BLACK); 
}

void loop()
{


  int LineState;
  int ObjectState;

  LineState = LineKeepDistance.detectLine();
  ObjectState = LineKeepDistance.detectObstacle();

  if(LINE_LEFT == LineState)
  {
    LineKeepDistance.runRightMotor(100,FORWARD);
    LineKeepDistance.runLeftMotor (100,REVERSE);//turn right

  }
  else if(LINE_LEFTCENTER == LineState)
  {
    LineKeepDistance.runLeftMotor(75,REVERSE);
    LineKeepDistance.runRightMotor (150,FORWARD);//turn right

  }
  else if(LINE_RIGHT == LineState)
  {
    LineKeepDistance.runLeftMotor(100,FORWARD);
    LineKeepDistance.runRightMotor(100,REVERSE);//turn left
  }
  else if(LINE_RIGHTCENTER == LineState)
  {
    LineKeepDistance.runRightMotor(75, REVERSE);
    LineKeepDistance.runLeftMotor(150,FORWARD);//turn left
  }
  else if(LINE_CENTER == LineState || OVER_LINE == LineState)
  {
    LineKeepDistance.moveForward(75);
  }

  else if (NO_LINE == LineState)
  {
    LineKeepDistance.stopMotors();   
  }
  if (ObjectState != NO_OBSTACLE)
   
  {
    LineKeepDistance.stopMotors();
  }
 
}



Offline akhen

  • Diesel Generator
  • *
  • Posts: 1293
  • Pogi/Ganda Points: 47
  • Gender: Female
  • "Learning is good but application is 100x better!"
Re: P-Bot Official Thread
« Reply #367 on: March 14, 2012, 03:28:13 PM »
nested if else statement ;D

try mo naman yung switch case ;D

Offline nokia3310

  • CR2032 Battery
  • **
  • Posts: 42
  • Pogi/Ganda Points: 1
Re: P-Bot Official Thread
« Reply #368 on: March 14, 2012, 06:33:11 PM »
ill try ko code the pbot without using library.. pero di xa gumagana.. lge lng po xang nagfoforward,, ano po bah ang problema nito?

line following po ito.. ito po ung code mga sir.. help naman po..
Code: [Select]
const int Col_Sen[3] = {2,3,4};
const int Lin_Sen[4] = {5,6,7};
const int M1Dir = 8;
const int M1Run = 9;
const int M2Run = 10;
const int M2Dir = 11;

void setup()
{
  for(int i=0;i<3;i++)
  {
    pinMode(Col_Sen[i],INPUT);
    pinMode(Lin_Sen[i],INPUT);
  }
 
  pinMode(M1Run,OUTPUT);
  pinMode(M2Run,OUTPUT);
  pinMode(M1Dir,OUTPUT);
  pinMode(M2Dir,OUTPUT);
 
  digitalWrite(M1Run,HIGH);
  digitalWrite(M1Dir,HIGH);
}

void loop()
{
  if (digitalRead(Lin_Sen[0] == HIGH && Lin_Sen[1] == HIGH && Lin_Sen[2] == HIGH))//all sensors
  {
    analogWrite(M1Run,75);
    analogWrite(M2Run,75);
    digitalWrite(M1Dir,HIGH);
    digitalWrite(M2Dir,HIGH);
  }
  else if (digitalRead(Lin_Sen[0] == LOW && Lin_Sen[1] == HIGH && Lin_Sen[2] == LOW))//center snesor
  {
    analogWrite(M1Run,75);
    analogWrite(M2Run,75);
    digitalWrite(M1Dir,HIGH);
    digitalWrite(M2Dir,HIGH);
  }
  else if (digitalRead(Lin_Sen[0] == HIGH && Lin_Sen[1] == HIGH && Lin_Sen[2] == LOW))//left center snesor
  {
    analogWrite(M1Run,75);
    analogWrite(M2Run,150);
    digitalWrite(M1Dir,HIGH);
    digitalWrite(M2Dir,LOW);
  }
  else if (digitalRead(Lin_Sen[0] == LOW && Lin_Sen[1] == HIGH && Lin_Sen[2] == HIGH))//right center snesor
  {
    analogWrite(M1Run,150);
    analogWrite(M2Run,75);
    digitalWrite(M1Dir,LOW);
    digitalWrite(M2Dir,HIGH);
  }
  else if (digitalRead(Lin_Sen[0] == HIGH && Lin_Sen[1] == LOW && Lin_Sen[2] == LOW))//left  snesor
  {
    analogWrite(M1Run,100);
    analogWrite(M2Run,100);
    digitalWrite(M1Dir,HIGH);
    digitalWrite(M2Dir,LOW);
  }
  else if (digitalRead(Lin_Sen[0] == LOW && Lin_Sen[1] == LOW && Lin_Sen[2] == HIGH))//right center snesor
  {
    analogWrite(M1Run,100);
    analogWrite(M2Run,100);
    digitalWrite(M1Dir,LOW);
    digitalWrite(M2Dir,HIGH);
  }
  else if (digitalRead(Lin_Sen[0] == LOW && Lin_Sen[1] == LOW && Lin_Sen[2] == LOW))//no snesor
  {
    analogWrite(M1Run,0);
    analogWrite(M2Run,0);
    digitalWrite(M1Dir,HIGH);
    digitalWrite(M2Dir,HIGH);
  }
}

Offline Macgyver

  • Diesel Generator
  • *
  • Posts: 1440
  • Pogi/Ganda Points: 70
    • MakerDude
Re: P-Bot Official Thread
« Reply #369 on: March 14, 2012, 10:08:00 PM »
try mo lagyan ng parenthesis baka sakali yun ang problem

if (
   (digitalRead(Lin_Sen[0] == HIGH) &&
   (Lin_Sen[1] == HIGH)   &&
   (Lin_Sen[2] == HIGH)
   )

do this sa lahat ng mga conditions mo na multiple conditions.
Become a Virtual Worker |  MakerDude.com Electronics Shop is now OPEN!

Offline glutnix_neo

  • Technical People
  • Nuclear Reactor
  • *****
  • Posts: 4162
  • Pogi/Ganda Points: 166
  • Gender: Female
  • A journey to a thousand lines begins w/ LED Blink
    • Underground Workbench
Re: P-Bot Official Thread
« Reply #370 on: March 14, 2012, 10:12:56 PM »
actually dapat siguro ganito yan...

Code: [Select]
if(digitalRead(Lin_Sen[0]) == HIGH
&& digitalRead(Lin_Sen[1]) == HIGH
&& digitalRead(Lin_Sen[2]) == HIGH)

Ang nangyari kasi eh...
Lin_Sen[0] == HIGH // false
Lin_Sen[1] == HIGH // false
Lin_Sen[2] == HIGH // false

false &&  false &&  false = false = 0

digitalRead(0) ang kakalabsan ng expression.

bakit 4 ang size ng array na to?
Code: [Select]
const int Lin_Sen[4] = {5,6,7};
If we hear,we forget;if we see, we remember;if we do,we understand.
Let's support the use of free and open source softwares...
http://UndergroundWorkbench.wordpress.com

Offline nokia3310

  • CR2032 Battery
  • **
  • Posts: 42
  • Pogi/Ganda Points: 1
Re: P-Bot Official Thread
« Reply #371 on: March 14, 2012, 11:17:35 PM »
actually dapat siguro ganito yan...

Code: [Select]
if(digitalRead(Lin_Sen[0]) == HIGH
&& digitalRead(Lin_Sen[1]) == HIGH
&& digitalRead(Lin_Sen[2]) == HIGH)

Ang nangyari kasi eh...
Lin_Sen[0] == HIGH // false
Lin_Sen[1] == HIGH // false
Lin_Sen[2] == HIGH // false

false &&  false &&  false = false = 0

digitalRead(0) ang kakalabsan ng expression.

bakit 4 ang size ng array na to?
Code: [Select]
const int Lin_Sen[4] = {5,6,7};

mali po ako sir.. dapat Lin_Sen[3]..

try ko na po ung lagyan ng digitalRead, same pa din ung problem.. forward parin ung takbo ng bot.. :-[

Offline glutnix_neo

  • Technical People
  • Nuclear Reactor
  • *****
  • Posts: 4162
  • Pogi/Ganda Points: 166
  • Gender: Female
  • A journey to a thousand lines begins w/ LED Blink
    • Underground Workbench
Re: P-Bot Official Thread
« Reply #372 on: March 14, 2012, 11:25:22 PM »
isa pa, nacheck mo ba kung active high ang sensors kapag may line?
If we hear,we forget;if we see, we remember;if we do,we understand.
Let's support the use of free and open source softwares...
http://UndergroundWorkbench.wordpress.com

Offline nokia3310

  • CR2032 Battery
  • **
  • Posts: 42
  • Pogi/Ganda Points: 1
Re: P-Bot Official Thread
« Reply #373 on: March 15, 2012, 12:00:31 AM »
isa pa, nacheck mo ba kung active high ang sensors kapag may line?

nka active high ug sensor pagmay line sir.., nilapat ko sa white surface tumatakbo pa rin ung motors..

Offline akhen

  • Diesel Generator
  • *
  • Posts: 1293
  • Pogi/Ganda Points: 47
  • Gender: Female
  • "Learning is good but application is 100x better!"
Re: P-Bot Official Thread
« Reply #374 on: March 15, 2012, 08:07:04 AM »
at TS suggestion lang. baka mas madali pag gumawa ka na lang ng functions.

Offline nokia3310

  • CR2032 Battery
  • **
  • Posts: 42
  • Pogi/Ganda Points: 1
Re: P-Bot Official Thread
« Reply #375 on: March 15, 2012, 09:56:44 AM »
un parin ung response.. di parin nagfofollow ng line.. :-[
ito ung recent code..
Code: [Select]
const int Col_Sen[3] = {2,3,4};
const int Lin_Sen[3] = {5,6,7};
const int M1Dir = 8;
const int M1Run = 9;
const int M2Run = 10;
const int M2Dir = 11;

void setup()
{
  for(int i=0;i<3;i++)
  {
    pinMode(Col_Sen[i],INPUT);
    pinMode(Lin_Sen[i],INPUT);
  }
 
  pinMode(M1Run,OUTPUT);
  pinMode(M2Run,OUTPUT);
  pinMode(M1Dir,OUTPUT);
  pinMode(M2Dir,OUTPUT);
 
  digitalWrite(M1Run,HIGH);
  digitalWrite(M1Dir,HIGH);
  digitalWrite(M2Run,HIGH);
  digitalWrite(M2Dir,HIGH);
}

void loop()
{
  if (digitalRead(Lin_Sen[0] == HIGH) && digitalRead (Lin_Sen[1] == HIGH) && digitalRead(Lin_Sen[2] == HIGH))//all sensors
  {
    analogWrite(M1Run,75);
    analogWrite(M2Run,75);
    digitalWrite(M1Dir,HIGH);
    digitalWrite(M2Dir,HIGH);
  }
  else if (digitalRead(Lin_Sen[0] == LOW) && digitalRead(Lin_Sen[1] == HIGH) && digitalRead(Lin_Sen[2] == LOW))//center snesor
  {
    analogWrite(M1Run,75);
    analogWrite(M2Run,75);
    digitalWrite(M1Dir,HIGH);
    digitalWrite(M2Dir,HIGH);
  }
  else if (digitalRead(Lin_Sen[0] == HIGH) && digitalRead(Lin_Sen[1] == HIGH) && digitalRead(Lin_Sen[2] == LOW))//left center snesor
  {
    analogWrite(M1Run,75);
    analogWrite(M2Run,150);
    digitalWrite(M1Dir,HIGH);
    digitalWrite(M2Dir,LOW);
  }
  else if (digitalRead(Lin_Sen[0] == LOW) && digitalRead(Lin_Sen[1] == HIGH) && digitalRead(Lin_Sen[2] == HIGH))//right center snesor
  {
    analogWrite(M1Run,150);
    analogWrite(M2Run,75);
    digitalWrite(M1Dir,LOW);
    digitalWrite(M2Dir,HIGH);
  }
  else if (digitalRead(Lin_Sen[0] == HIGH) && digitalRead(Lin_Sen[1] == LOW) && digitalRead(Lin_Sen[2] == LOW))//left  snesor
  {
    analogWrite(M1Run,100);
    analogWrite(M2Run,100);
    digitalWrite(M1Dir,HIGH);
    digitalWrite(M2Dir,LOW);
  }
  else if (digitalRead(Lin_Sen[0] == LOW) && digitalRead(Lin_Sen[1] == LOW) && digitalRead(Lin_Sen[2] == HIGH))//right center snesor
  {
    analogWrite(M1Run,100);
    analogWrite(M2Run,100);
    digitalWrite(M1Dir,LOW);
    digitalWrite(M2Dir,HIGH);
  }
  else if (digitalRead(Lin_Sen[0] == LOW) && digitalRead(Lin_Sen[1] == LOW) && digitalRead(Lin_Sen[2] == LOW))//no snesor
  {
    analogWrite(M1Run,0);
    analogWrite(M2Run,0);
    digitalWrite(M1Dir,HIGH);
    digitalWrite(M2Dir,HIGH);
  }
}

Offline glutnix_neo

  • Technical People
  • Nuclear Reactor
  • *****
  • Posts: 4162
  • Pogi/Ganda Points: 166
  • Gender: Female
  • A journey to a thousand lines begins w/ LED Blink
    • Underground Workbench
Re: P-Bot Official Thread
« Reply #376 on: March 15, 2012, 10:04:25 AM »
mali pa rin kuya eh...
Code: [Select]
digitalRead(Lin_Sen[0] == HIGH)
dapat ganito
Code: [Select]
digitalRead(Lin_Sen[0]) == HIGH
yung result ang ikocompare sa HIGH na constant...

for some programmers it is safer to write it this way para maiwasan ang typo...
Code: [Select]
(HIGH == digitalRead(Lin_Sen[0]))
and enclosed palagi sa parenthesis kung ia-AND sa ibang conditions....

rationale, example isang = lang ang nailagay mo
Quote
(HIGH = digitalRead(Lin_Sen[0]))

eto ay di magcocompile so mapupuna mo agad ang mali, dun sa isang case kapag isang = lang ang inilagay mo eh maaring issign nya ang HIGH na value sa variable at magcompile ng tama pero mali ang response.

If we hear,we forget;if we see, we remember;if we do,we understand.
Let's support the use of free and open source softwares...
http://UndergroundWorkbench.wordpress.com

Offline glutnix_neo

  • Technical People
  • Nuclear Reactor
  • *****
  • Posts: 4162
  • Pogi/Ganda Points: 166
  • Gender: Female
  • A journey to a thousand lines begins w/ LED Blink
    • Underground Workbench
Re: P-Bot Official Thread
« Reply #377 on: March 15, 2012, 10:14:20 AM »
at TS suggestion lang. baka mas madali pag gumawa ka na lang ng functions.

ako po si TS, nyahahaha,

Natry na ni sir nokia s using PBot library, baka nageexplore lang sya kung paano gawin sa low level,

kahit ako kapag nagcocode ng madalian eh inilalagay ko muna sa surrogate function then kapag gumagana na eh saka ko inililipat sa sarili nyang function. ;D ;D ;D
If we hear,we forget;if we see, we remember;if we do,we understand.
Let's support the use of free and open source softwares...
http://UndergroundWorkbench.wordpress.com

Offline glutnix_neo

  • Technical People
  • Nuclear Reactor
  • *****
  • Posts: 4162
  • Pogi/Ganda Points: 166
  • Gender: Female
  • A journey to a thousand lines begins w/ LED Blink
    • Underground Workbench
Re: P-Bot Official Thread
« Reply #378 on: March 15, 2012, 10:26:23 AM »
rewrite ko lang yung code using PBot library...

Code: [Select]
#include <PBot.h>

PBotClass  LineFollower;

void setup()
{
  LineFollower.begin(LINETRACKING,WHITE,BLACK);  
}

void loop()
{
  int LineState;
  int ObjectState;

  LineState = LineFollower.detectLine();
  ObjectState = LineFollower.detectObstacle();

  if(LINE_LEFT == LineState)
  {
LineFollower.rotateLeft(100);
  }
  else if(LINE_LEFTCENTER == LineState)
  {
LineFollower.rotateLeft(75);
  }
  else if(LINE_RIGHT == LineState)
  {
LineFollower.rotateRight(100);
  }
  else if(LINE_RIGHTCENTER == LineState)
  {
LineFollower.rotateRight(75);
  }
  else if((LINE_CENTER == LineState) || (OVER_LINE == LineState))
  {
        LineFollower.moveForward(75);
  }
  else if (NO_LINE == LineState)
  {
        LineFollower.stopMotors();  
  }
  else
  {
/* no response */
  }
  
  if(ObjectState != NO_OBSTACLE)
  {
        LineFollower.stopMotors();
  }
}
If we hear,we forget;if we see, we remember;if we do,we understand.
Let's support the use of free and open source softwares...
http://UndergroundWorkbench.wordpress.com

Offline akhen

  • Diesel Generator
  • *
  • Posts: 1293
  • Pogi/Ganda Points: 47
  • Gender: Female
  • "Learning is good but application is 100x better!"
Re: P-Bot Official Thread
« Reply #379 on: March 15, 2012, 10:51:29 AM »
ako po si TS, nyahahaha,

ay oo nga pala. mali ;D ;D ;D

Philippine Electronics Forum

Re: P-Bot Official Thread
« Reply #379 on: March 15, 2012, 10:51:29 AM »

 

Privacy Policy

Contact Us: elabph@yahoo.com